@@ -40,6 +40,10 @@ type ProvisioningResources struct {
4040 downtimes map [string ]* provapipb.Downtime
4141 protectionAssociationGroups map [string ]* provapipb.ProtectionAssociationGroup
4242 disjointAssociationGroups map [string ]* provapipb.DisjointAssociationGroup
43+ links map [string ]* provapipb.Link
44+ geographicRegions map [string ]* provapipb.GeographicRegion
45+ emissionsLimits map [string ]* provapipb.EmissionsLimit
46+ emissionsTargets map [string ]* provapipb.EmissionsTarget
4347}
4448
4549func (pr * ProvisioningResources ) String () string {
@@ -49,6 +53,10 @@ func (pr *ProvisioningResources) String() string {
4953 lo .Keys (pr .downtimes ),
5054 lo .Keys (pr .protectionAssociationGroups ),
5155 lo .Keys (pr .disjointAssociationGroups ),
56+ lo .Keys (pr .links ),
57+ lo .Keys (pr .geographicRegions ),
58+ lo .Keys (pr .emissionsLimits ),
59+ lo .Keys (pr .emissionsTargets ),
5260 )
5361
5462 if len (keys ) == 0 {
@@ -73,6 +81,10 @@ func (pr *ProvisioningResources) MarshalledString(marshaller protoFormat) string
7381 lo .Entries (marshalMap (pr .downtimes , marshaller )),
7482 lo .Entries (marshalMap (pr .protectionAssociationGroups , marshaller )),
7583 lo .Entries (marshalMap (pr .disjointAssociationGroups , marshaller )),
84+ lo .Entries (marshalMap (pr .links , marshaller )),
85+ lo .Entries (marshalMap (pr .geographicRegions , marshaller )),
86+ lo .Entries (marshalMap (pr .emissionsLimits , marshaller )),
87+ lo .Entries (marshalMap (pr .emissionsTargets , marshaller )),
7688 )
7789 slices .SortFunc (entries , func (e1 , e2 lo.Entry [string , string ]) int { return strings .Compare (e1 .Key , e2 .Key ) })
7890
@@ -89,6 +101,10 @@ func NewProvisioningResources() *ProvisioningResources {
89101 downtimes : map [string ]* provapipb.Downtime {},
90102 protectionAssociationGroups : map [string ]* provapipb.ProtectionAssociationGroup {},
91103 disjointAssociationGroups : map [string ]* provapipb.DisjointAssociationGroup {},
104+ links : map [string ]* provapipb.Link {},
105+ geographicRegions : map [string ]* provapipb.GeographicRegion {},
106+ emissionsLimits : map [string ]* provapipb.EmissionsLimit {},
107+ emissionsTargets : map [string ]* provapipb.EmissionsTarget {},
92108 }
93109}
94110
@@ -97,7 +113,11 @@ func (pr *ProvisioningResources) ResourceCount() int {
97113 len (pr .p2pSrTePolicyCandidatePaths ) +
98114 len (pr .downtimes ) +
99115 len (pr .protectionAssociationGroups ) +
100- len (pr .disjointAssociationGroups )
116+ len (pr .disjointAssociationGroups ) +
117+ len (pr .links ) +
118+ len (pr .geographicRegions ) +
119+ len (pr .emissionsLimits ) +
120+ len (pr .emissionsTargets )
101121}
102122
103123func (pr * ProvisioningResources ) InsertProvisioningResources (resources * provnbipb.ProvisioningResources ) {
@@ -106,6 +126,10 @@ func (pr *ProvisioningResources) InsertProvisioningResources(resources *provnbip
106126 pr .insertDowntimes (resources .GetDowntimes ())
107127 pr .insertProtectionAssociationGroups (resources .GetProtectionAssociationGroups ())
108128 pr .insertDisjointAssociationGroups (resources .GetDisjointAssociationGroups ())
129+ pr .insertLinks (resources .GetLinks ())
130+ pr .insertGeographicRegions (resources .GetGeographicRegions ())
131+ pr .insertEmissionsLimits (resources .GetEmissionsLimits ())
132+ pr .insertEmissionsTargets (resources .GetEmissionsTargets ())
109133}
110134
111135func ProvisioningResourcesFromRemote (ctx context.Context , client provapipb.ProvisioningClient ) (* ProvisioningResources , error ) {
@@ -143,6 +167,46 @@ func ProvisioningResourcesFromRemote(ctx context.Context, client provapipb.Provi
143167 return nil
144168 })
145169
170+ var links []* provapipb.Link
171+ p .Go (func () error {
172+ result , err := client .ListLinks (ctx , & provapipb.ListLinksRequest {})
173+ if err != nil {
174+ return err
175+ }
176+ links = result .GetLinks ()
177+ return nil
178+ })
179+
180+ var geographicRegions []* provapipb.GeographicRegion
181+ p .Go (func () error {
182+ result , err := client .ListGeographicRegions (ctx , & provapipb.ListGeographicRegionsRequest {})
183+ if err != nil {
184+ return err
185+ }
186+ geographicRegions = result .GetGeographicRegions ()
187+ return nil
188+ })
189+
190+ var emissionsLimits []* provapipb.EmissionsLimit
191+ p .Go (func () error {
192+ result , err := client .ListEmissionsLimits (ctx , & provapipb.ListEmissionsLimitsRequest {})
193+ if err != nil {
194+ return err
195+ }
196+ emissionsLimits = result .GetEmissionsLimits ()
197+ return nil
198+ })
199+
200+ var emissionsTargets []* provapipb.EmissionsTarget
201+ p .Go (func () error {
202+ result , err := client .ListEmissionsTargets (ctx , & provapipb.ListEmissionsTargetsRequest {})
203+ if err != nil {
204+ return err
205+ }
206+ emissionsTargets = result .GetEmissionsTargets ()
207+ return nil
208+ })
209+
146210 result , err := client .ListP2PSrTePolicies (ctx , & provapipb.ListP2PSrTePoliciesRequest {})
147211 if err != nil {
148212 return nil , err
@@ -176,6 +240,10 @@ func ProvisioningResourcesFromRemote(ctx context.Context, client provapipb.Provi
176240 pr .insertDowntimes (downtimes )
177241 pr .insertProtectionAssociationGroups (protectionAssociationGroups )
178242 pr .insertDisjointAssociationGroups (disjointAssociationGroups )
243+ pr .insertLinks (links )
244+ pr .insertGeographicRegions (geographicRegions )
245+ pr .insertEmissionsLimits (emissionsLimits )
246+ pr .insertEmissionsTargets (emissionsTargets )
179247
180248 return pr , nil
181249}
@@ -210,6 +278,30 @@ func (pr *ProvisioningResources) insertDisjointAssociationGroups(entries []*prov
210278 }
211279}
212280
281+ func (pr * ProvisioningResources ) insertLinks (entries []* provapipb.Link ) {
282+ for _ , entry := range entries {
283+ pr .links [entry .GetName ()] = entry
284+ }
285+ }
286+
287+ func (pr * ProvisioningResources ) insertGeographicRegions (entries []* provapipb.GeographicRegion ) {
288+ for _ , entry := range entries {
289+ pr .geographicRegions [entry .GetName ()] = entry
290+ }
291+ }
292+
293+ func (pr * ProvisioningResources ) insertEmissionsLimits (entries []* provapipb.EmissionsLimit ) {
294+ for _ , entry := range entries {
295+ pr .emissionsLimits [entry .GetName ()] = entry
296+ }
297+ }
298+
299+ func (pr * ProvisioningResources ) insertEmissionsTargets (entries []* provapipb.EmissionsTarget ) {
300+ for _ , entry := range entries {
301+ pr .emissionsTargets [entry .GetName ()] = entry
302+ }
303+ }
304+
213305func provisioningResourcesAreEquivalent [T proto.Message ](a , b T ) bool {
214306 // TODO: find a more robust equivalency check.
215307 return proto .Equal (a , b )
@@ -290,6 +382,10 @@ func ProvisioningSync(appCtx *cli.Context) error {
290382 "downtimes" : lo .Without (lo .Keys (localResources .downtimes ), lo .Keys (remoteResources .downtimes )... ),
291383 "protectionAssociationGroups" : lo .Without (lo .Keys (localResources .protectionAssociationGroups ), lo .Keys (remoteResources .protectionAssociationGroups )... ),
292384 "disjointAssociationGroups" : lo .Without (lo .Keys (localResources .disjointAssociationGroups ), lo .Keys (remoteResources .disjointAssociationGroups )... ),
385+ "links" : lo .Without (lo .Keys (localResources .links ), lo .Keys (remoteResources .links )... ),
386+ "geographicRegions" : lo .Without (lo .Keys (localResources .geographicRegions ), lo .Keys (remoteResources .geographicRegions )... ),
387+ "emissionsLimits" : lo .Without (lo .Keys (localResources .emissionsLimits ), lo .Keys (remoteResources .emissionsLimits )... ),
388+ "emissionsTargets" : lo .Without (lo .Keys (localResources .emissionsTargets ), lo .Keys (remoteResources .emissionsTargets )... ),
293389 }
294390
295391 resourcesInCommon := map [string ][]string {
@@ -298,6 +394,10 @@ func ProvisioningSync(appCtx *cli.Context) error {
298394 "downtimes" : lo .Intersect (lo .Keys (localResources .downtimes ), lo .Keys (remoteResources .downtimes )),
299395 "protectionAssociationGroups" : lo .Intersect (lo .Keys (localResources .protectionAssociationGroups ), lo .Keys (remoteResources .protectionAssociationGroups )),
300396 "disjointAssociationGroups" : lo .Intersect (lo .Keys (localResources .disjointAssociationGroups ), lo .Keys (remoteResources .disjointAssociationGroups )),
397+ "links" : lo .Intersect (lo .Keys (localResources .links ), lo .Keys (remoteResources .links )),
398+ "geographicRegions" : lo .Intersect (lo .Keys (localResources .geographicRegions ), lo .Keys (remoteResources .geographicRegions )),
399+ "emissionsLimits" : lo .Intersect (lo .Keys (localResources .emissionsLimits ), lo .Keys (remoteResources .emissionsLimits )),
400+ "emissionsTargets" : lo .Intersect (lo .Keys (localResources .emissionsTargets ), lo .Keys (remoteResources .emissionsTargets )),
301401 }
302402
303403 fmt .Println ("\n comparing local and remote resources:" )
@@ -315,6 +415,10 @@ func ProvisioningSync(appCtx *cli.Context) error {
315415 downtimes : lo .Without (lo .Keys (remoteResources .downtimes ), lo .Keys (localResources .downtimes )... ),
316416 protectionAssociationGroups : lo .Without (lo .Keys (remoteResources .protectionAssociationGroups ), lo .Keys (localResources .protectionAssociationGroups )... ),
317417 disjointAssociationGroups : lo .Without (lo .Keys (remoteResources .disjointAssociationGroups ), lo .Keys (localResources .disjointAssociationGroups )... ),
418+ links : lo .Without (lo .Keys (remoteResources .links ), lo .Keys (localResources .links )... ),
419+ geographicRegions : lo .Without (lo .Keys (remoteResources .geographicRegions ), lo .Keys (localResources .geographicRegions )... ),
420+ emissionsLimits : lo .Without (lo .Keys (remoteResources .emissionsLimits ), lo .Keys (localResources .emissionsLimits )... ),
421+ emissionsTargets : lo .Without (lo .Keys (remoteResources .emissionsTargets ), lo .Keys (localResources .emissionsTargets )... ),
318422
319423 printMode : printMode ,
320424 dryRunMode : dryRunMode ,
@@ -327,6 +431,10 @@ func ProvisioningSync(appCtx *cli.Context) error {
327431 deleteParams .downtimes ,
328432 deleteParams .protectionAssociationGroups ,
329433 deleteParams .disjointAssociationGroups ,
434+ deleteParams .links ,
435+ deleteParams .geographicRegions ,
436+ deleteParams .emissionsLimits ,
437+ deleteParams .emissionsTargets ,
330438 )))
331439
332440 err := deleteProvisioning (ctx , deleteParams )
@@ -387,6 +495,46 @@ func ProvisioningSync(appCtx *cli.Context) error {
387495 return err
388496 })... )
389497 })
498+ p .Go (func () error {
499+ return errors .Join (updateRemoteResources [* provapipb.Link ](
500+ resourcesInCommon ["links" ], localResources .links , remoteResources .links , printMode , dryRunMode , func (link * provapipb.Link ) error {
501+ _ , err := provisioningClient .UpdateLink (ctx , & provapipb.UpdateLinkRequest {
502+ Link : link ,
503+ AllowMissing : false ,
504+ })
505+ return err
506+ })... )
507+ })
508+ p .Go (func () error {
509+ return errors .Join (updateRemoteResources [* provapipb.GeographicRegion ](
510+ resourcesInCommon ["geographicRegions" ], localResources .geographicRegions , remoteResources .geographicRegions , printMode , dryRunMode , func (geographicRegion * provapipb.GeographicRegion ) error {
511+ _ , err := provisioningClient .UpdateGeographicRegion (ctx , & provapipb.UpdateGeographicRegionRequest {
512+ GeographicRegion : geographicRegion ,
513+ AllowMissing : false ,
514+ })
515+ return err
516+ })... )
517+ })
518+ p .Go (func () error {
519+ return errors .Join (updateRemoteResources [* provapipb.EmissionsLimit ](
520+ resourcesInCommon ["emissionsLimits" ], localResources .emissionsLimits , remoteResources .emissionsLimits , printMode , dryRunMode , func (emissionsLimit * provapipb.EmissionsLimit ) error {
521+ _ , err := provisioningClient .UpdateEmissionsLimit (ctx , & provapipb.UpdateEmissionsLimitRequest {
522+ EmissionsLimit : emissionsLimit ,
523+ AllowMissing : false ,
524+ })
525+ return err
526+ })... )
527+ })
528+ p .Go (func () error {
529+ return errors .Join (updateRemoteResources [* provapipb.EmissionsTarget ](
530+ resourcesInCommon ["emissionsTargets" ], localResources .emissionsTargets , remoteResources .emissionsTargets , printMode , dryRunMode , func (emissionsTarget * provapipb.EmissionsTarget ) error {
531+ _ , err := provisioningClient .UpdateEmissionsTarget (ctx , & provapipb.UpdateEmissionsTargetRequest {
532+ EmissionsTarget : emissionsTarget ,
533+ AllowMissing : false ,
534+ })
535+ return err
536+ })... )
537+ })
390538
391539 ///
392540 // Add resources.
@@ -443,6 +591,46 @@ func ProvisioningSync(appCtx *cli.Context) error {
443591 return err
444592 })... )
445593 })
594+ p .Go (func () error {
595+ return errors .Join (createRemoteResources [* provapipb.Link ](
596+ resourcesToBeAdded ["links" ], localResources .links , printMode , dryRunMode , func (link * provapipb.Link ) error {
597+ _ , err := provisioningClient .UpdateLink (ctx , & provapipb.UpdateLinkRequest {
598+ Link : link ,
599+ AllowMissing : true ,
600+ })
601+ return err
602+ })... )
603+ })
604+ p .Go (func () error {
605+ return errors .Join (createRemoteResources [* provapipb.GeographicRegion ](
606+ resourcesToBeAdded ["geographicRegions" ], localResources .geographicRegions , printMode , dryRunMode , func (geographicRegion * provapipb.GeographicRegion ) error {
607+ _ , err := provisioningClient .UpdateGeographicRegion (ctx , & provapipb.UpdateGeographicRegionRequest {
608+ GeographicRegion : geographicRegion ,
609+ AllowMissing : true ,
610+ })
611+ return err
612+ })... )
613+ })
614+ p .Go (func () error {
615+ return errors .Join (createRemoteResources [* provapipb.EmissionsLimit ](
616+ resourcesToBeAdded ["emissionsLimits" ], localResources .emissionsLimits , printMode , dryRunMode , func (emissionsLimit * provapipb.EmissionsLimit ) error {
617+ _ , err := provisioningClient .UpdateEmissionsLimit (ctx , & provapipb.UpdateEmissionsLimitRequest {
618+ EmissionsLimit : emissionsLimit ,
619+ AllowMissing : true ,
620+ })
621+ return err
622+ })... )
623+ })
624+ p .Go (func () error {
625+ return errors .Join (createRemoteResources [* provapipb.EmissionsTarget ](
626+ resourcesToBeAdded ["emissionsTargets" ], localResources .emissionsTargets , printMode , dryRunMode , func (emissionsTarget * provapipb.EmissionsTarget ) error {
627+ _ , err := provisioningClient .UpdateEmissionsTarget (ctx , & provapipb.UpdateEmissionsTargetRequest {
628+ EmissionsTarget : emissionsTarget ,
629+ AllowMissing : true ,
630+ })
631+ return err
632+ })... )
633+ })
446634
447635 errs = append (errs , p .Wait ())
448636 return errors .Join (errs ... )
@@ -477,6 +665,10 @@ type deleteProvisioningParams struct {
477665 downtimes []string
478666 protectionAssociationGroups []string
479667 disjointAssociationGroups []string
668+ links []string
669+ geographicRegions []string
670+ emissionsLimits []string
671+ emissionsTargets []string
480672
481673 printMode bool
482674 dryRunMode bool
@@ -551,6 +743,50 @@ func deleteProvisioning(ctx context.Context, params deleteProvisioningParams) er
551743 })... )
552744 })
553745 }
746+ if len (params .links ) > 0 {
747+ p .Go (func () error {
748+ return errors .Join (deleteRemoteResources (
749+ params .links , printMode , dryRunMode , func (link string ) error {
750+ _ , err := client .DeleteLink (ctx , & provapipb.DeleteLinkRequest {
751+ Name : link ,
752+ })
753+ return err
754+ })... )
755+ })
756+ }
757+ if len (params .geographicRegions ) > 0 {
758+ p .Go (func () error {
759+ return errors .Join (deleteRemoteResources (
760+ params .geographicRegions , printMode , dryRunMode , func (geographicRegion string ) error {
761+ _ , err := client .DeleteGeographicRegion (ctx , & provapipb.DeleteGeographicRegionRequest {
762+ Name : geographicRegion ,
763+ })
764+ return err
765+ })... )
766+ })
767+ }
768+ if len (params .emissionsLimits ) > 0 {
769+ p .Go (func () error {
770+ return errors .Join (deleteRemoteResources (
771+ params .emissionsLimits , printMode , dryRunMode , func (emissionsLimit string ) error {
772+ _ , err := client .DeleteEmissionsLimit (ctx , & provapipb.DeleteEmissionsLimitRequest {
773+ Name : emissionsLimit ,
774+ })
775+ return err
776+ })... )
777+ })
778+ }
779+ if len (params .emissionsTargets ) > 0 {
780+ p .Go (func () error {
781+ return errors .Join (deleteRemoteResources (
782+ params .emissionsTargets , printMode , dryRunMode , func (emissionsTarget string ) error {
783+ _ , err := client .DeleteEmissionsTarget (ctx , & provapipb.DeleteEmissionsTargetRequest {
784+ Name : emissionsTarget ,
785+ })
786+ return err
787+ })... )
788+ })
789+ }
554790
555791 return p .Wait ()
556792}
@@ -583,6 +819,10 @@ func ProvisioningDeleteAll(appCtx *cli.Context) error {
583819 downtimes : lo .Keys (remoteResources .downtimes ),
584820 protectionAssociationGroups : lo .Keys (remoteResources .protectionAssociationGroups ),
585821 disjointAssociationGroups : lo .Keys (remoteResources .disjointAssociationGroups ),
822+ links : lo .Keys (remoteResources .links ),
823+ geographicRegions : lo .Keys (remoteResources .geographicRegions ),
824+ emissionsLimits : lo .Keys (remoteResources .emissionsLimits ),
825+ emissionsTargets : lo .Keys (remoteResources .emissionsTargets ),
586826 }
587827
588828 return deleteProvisioning (appCtx .Context , params )
@@ -621,13 +861,21 @@ func ProvisioningDelete(appCtx *cli.Context) error {
621861 params .downtimes = lo .Intersect (resourceNames , lo .Keys (remoteResources .downtimes ))
622862 params .protectionAssociationGroups = lo .Intersect (resourceNames , lo .Keys (remoteResources .protectionAssociationGroups ))
623863 params .disjointAssociationGroups = lo .Intersect (resourceNames , lo .Keys (remoteResources .disjointAssociationGroups ))
864+ params .links = lo .Intersect (resourceNames , lo .Keys (remoteResources .links ))
865+ params .geographicRegions = lo .Intersect (resourceNames , lo .Keys (remoteResources .geographicRegions ))
866+ params .emissionsLimits = lo .Intersect (resourceNames , lo .Keys (remoteResources .emissionsLimits ))
867+ params .emissionsTargets = lo .Intersect (resourceNames , lo .Keys (remoteResources .emissionsTargets ))
624868
625869 deleteResourceNameSet := slices .Concat (
626870 params .p2pSrTePolicies ,
627871 params .p2pSrTePolicyCandidatePaths ,
628872 params .downtimes ,
629873 params .protectionAssociationGroups ,
630874 params .disjointAssociationGroups ,
875+ params .links ,
876+ params .geographicRegions ,
877+ params .emissionsLimits ,
878+ params .emissionsTargets ,
631879 )
632880
633881 notFoundNames := lo .Without (resourceNames , deleteResourceNameSet ... )
0 commit comments