@@ -6,11 +6,13 @@ import {
66 Subject ,
77 catchError ,
88 concatMap ,
9+ defer ,
910 from ,
1011 map ,
1112 mergeMap ,
1213 of ,
1314 reduce ,
15+ retry ,
1416 tap ,
1517 throwError ,
1618} from 'rxjs' ;
@@ -37,21 +39,42 @@ export class Operator extends ADCSDK.backend.BackendEventSource {
3739 private operate ( event : ADCSDK . Event ) {
3840 const { type, resourceType, resourceId, parentId } = event ;
3941 const isUpdate = type !== ADCSDK . EventType . DELETE ;
40- const path = `/apisix/admin/${
41- resourceType === ADCSDK . ResourceType . CONSUMER_CREDENTIAL
42- ? `consumers/${ parentId } /credentials/${ resourceId } `
43- : `${ resourceTypeToAPIName ( resourceType ) } /${ resourceId } `
44- } `;
42+ const PATH_PREFIX = '/apisix/admin' ;
43+ const paths = [
44+ `${ PATH_PREFIX } /${
45+ resourceType === ADCSDK . ResourceType . CONSUMER_CREDENTIAL
46+ ? `consumers/${ parentId } /credentials/${ resourceId } `
47+ : `${ resourceTypeToAPIName ( resourceType ) } /${ resourceId } `
48+ } `,
49+ ] ;
4550
46- return from (
47- this . client . request ( {
48- method : 'DELETE' ,
49- url : path ,
50- ...( isUpdate && {
51- method : 'PUT' ,
52- data : this . fromADC ( event , this . opts . version ) ,
53- } ) ,
54- } ) ,
51+ if ( event . resourceType === ADCSDK . ResourceType . SERVICE ) {
52+ const path = `${ PATH_PREFIX } /upstreams/${ event . resourceId } ` ;
53+ if ( event . type === ADCSDK . EventType . DELETE )
54+ paths . push ( path ) ; // services will be deleted before upstreams
55+ else paths . unshift ( path ) ; // services will be created/updated after upstreams
56+ }
57+
58+ const operateWithRetry = ( op : ( ) => Promise < AxiosResponse > ) =>
59+ defer ( op ) . pipe ( retry ( { count : 3 , delay : 100 } ) ) ;
60+ return from ( paths ) . pipe (
61+ map (
62+ ( path ) => ( ) =>
63+ this . client . request ( {
64+ method : 'DELETE' ,
65+ url : path ,
66+ ...( isUpdate && {
67+ method : 'PUT' ,
68+ data :
69+ event . resourceType === ADCSDK . ResourceType . SERVICE &&
70+ path . includes ( '/upstreams' )
71+ ? ( this . fromADC ( event , this . opts . version ) as typing . Service )
72+ . upstream
73+ : this . fromADC ( event , this . opts . version ) ,
74+ } ) ,
75+ } ) ,
76+ ) ,
77+ concatMap ( operateWithRetry ) ,
5578 ) ;
5679 }
5780
@@ -192,14 +215,21 @@ export class Operator extends ADCSDK.backend.BackendEventSource {
192215 ( event . newValue as ADCSDK . Route ) . id = event . resourceId ;
193216 const route = fromADC . transformRoute (
194217 event . newValue as ADCSDK . Route ,
195- event . parentId ,
218+ event . parentId ! ,
196219 ) ;
197220 if ( event . parentId ) route . service_id = event . parentId ;
198221 return route ;
199222 }
200- case ADCSDK . ResourceType . SERVICE :
223+ case ADCSDK . ResourceType . SERVICE : {
201224 ( event . newValue as ADCSDK . Service ) . id = event . resourceId ;
202- return fromADC . transformService ( event . newValue as ADCSDK . Service ) ;
225+ const [ service , upstream ] = fromADC . transformService (
226+ event . newValue as ADCSDK . Service ,
227+ ) ;
228+ return {
229+ ...service ,
230+ ...( upstream && { upstream : upstream } ) ,
231+ } ;
232+ }
203233 case ADCSDK . ResourceType . SSL :
204234 ( event . newValue as ADCSDK . SSL ) . id = event . resourceId ;
205235 return fromADC . transformSSL ( event . newValue as ADCSDK . SSL ) ;
0 commit comments