@@ -550,6 +550,172 @@ func (service *HTTPRestService) getAllNetworkContainerResponses(
550550 return getNetworkContainersResponse
551551}
552552
553+ // Copy of above function as I can't easly change the GetNetworkContainerResponse, too many dependancies
554+ func (service * HTTPRestService ) getAllNetworkContainerResponsesIPv6 (
555+ req cns.GetNetworkContainerRequest ,
556+ ) ([]cns.GetNetworkContainerResponse , []cns.CreateNetworkContainerRequest ) {
557+ var (
558+ getNetworkContainerResponse cns.GetNetworkContainerResponse
559+ ncs []string
560+ skipNCVersionCheck = false
561+ )
562+
563+ service .Lock ()
564+ defer service .Unlock ()
565+
566+ switch service .state .OrchestratorType {
567+ case cns .Kubernetes , cns .ServiceFabric , cns .Batch , cns .DBforPostgreSQL , cns .AzureFirstParty :
568+ podInfo , err := cns .UnmarshalPodInfo (req .OrchestratorContext )
569+ getNetworkContainersResponse := []cns.GetNetworkContainerResponse {}
570+
571+ if err != nil {
572+ response := cns.Response {
573+ ReturnCode : types .UnexpectedError ,
574+ Message : fmt .Sprintf ("Unmarshalling orchestrator context failed with error %v" , err ),
575+ }
576+
577+ getNetworkContainerResponse .Response = response
578+ getNetworkContainersResponse = append (getNetworkContainersResponse , getNetworkContainerResponse )
579+ return getNetworkContainersResponse , nil
580+ }
581+
582+ // get networkContainerIDs as string, "nc1, nc2"
583+ orchestratorContext := podInfo .Name () + podInfo .Namespace ()
584+ if service .state .ContainerIDByOrchestratorContext [orchestratorContext ] != nil {
585+ ncs = strings .Split (string (* service .state .ContainerIDByOrchestratorContext [orchestratorContext ]), "," )
586+ }
587+
588+ // This indicates that there are no ncs for the given orchestrator context
589+ if len (ncs ) == 0 {
590+ response := cns.Response {
591+ ReturnCode : types .UnknownContainerID ,
592+ Message : fmt .Sprintf ("Failed to find networkContainerID for orchestratorContext %s" , orchestratorContext ),
593+ }
594+
595+ getNetworkContainerResponse .Response = response
596+ getNetworkContainersResponse = append (getNetworkContainersResponse , getNetworkContainerResponse )
597+ return getNetworkContainersResponse , nil
598+ }
599+
600+ ctx , cancel := context .WithTimeout (context .Background (), nmaAPICallTimeout )
601+ defer cancel ()
602+ ncVersionListResp , err := service .nma .GetNCVersionList (ctx )
603+ if err != nil {
604+ skipNCVersionCheck = true
605+ logger .Errorf ("failed to get nc version list from nmagent" )
606+ // TODO: Add telemetry as this has potential to have containers in the running state w/o datapath working
607+ }
608+ nmaNCs := map [string ]string {}
609+ for _ , nc := range ncVersionListResp .Containers {
610+ // store nmaNCID as lower case to allow case insensitive comparison with nc stored in CNS
611+ nmaNCs [strings .TrimPrefix (lowerCaseNCGuid (nc .NetworkContainerID ), cns .SwiftPrefix )] = nc .Version
612+ }
613+
614+ if ! skipNCVersionCheck {
615+ for _ , ncid := range ncs {
616+ waitingForUpdate := false
617+ // If the goal state is available with CNS, check if the NC is pending VFP programming
618+ waitingForUpdate , getNetworkContainerResponse .Response .ReturnCode , getNetworkContainerResponse .Response .Message = service .isNCWaitingForUpdate (service .state .ContainerStatus [ncid ].CreateNetworkContainerRequest .Version , ncid , nmaNCs ) //nolint:lll // bad code
619+ // If the return code is not success, return the error to the caller
620+ if getNetworkContainerResponse .Response .ReturnCode == types .NetworkContainerVfpProgramPending {
621+ logger .Errorf ("[Azure-CNS] isNCWaitingForUpdate failed for NCID: %s" , ncid )
622+ }
623+
624+ vfpUpdateComplete := ! waitingForUpdate
625+ ncstatus := service .state .ContainerStatus [ncid ]
626+ // Update the container status if-
627+ // 1. VfpUpdateCompleted successfully
628+ // 2. VfpUpdateComplete changed to false
629+ if (getNetworkContainerResponse .Response .ReturnCode == types .NetworkContainerVfpProgramComplete &&
630+ vfpUpdateComplete && ncstatus .VfpUpdateComplete != vfpUpdateComplete ) ||
631+ (! vfpUpdateComplete && ncstatus .VfpUpdateComplete != vfpUpdateComplete ) {
632+ logger .Printf ("[Azure-CNS] Setting VfpUpdateComplete to %t for NCID: %s" , vfpUpdateComplete , ncid )
633+ ncstatus .VfpUpdateComplete = vfpUpdateComplete
634+ service .state .ContainerStatus [ncid ] = ncstatus
635+ if err = service .saveState (); err != nil {
636+ logger .Errorf ("Failed to save goal states for nc %+v due to %s" , getNetworkContainerResponse , err )
637+ }
638+ }
639+ }
640+ }
641+
642+ if service .ChannelMode == cns .Managed {
643+ // If the NC goal state doesn't exist in CNS running in managed mode, call DNC to retrieve the goal state
644+ var (
645+ dncEP = service .GetOption (acn .OptPrivateEndpoint ).(string )
646+ infraVnet = service .GetOption (acn .OptInfrastructureNetworkID ).(string )
647+ nodeID = service .GetOption (acn .OptNodeID ).(string )
648+ )
649+
650+ service .Unlock ()
651+ getNetworkContainerResponse .Response .ReturnCode , getNetworkContainerResponse .Response .Message = service .SyncNodeStatus (dncEP , infraVnet , nodeID , req .OrchestratorContext )
652+ service .Lock ()
653+ if getNetworkContainerResponse .Response .ReturnCode == types .NotFound {
654+ getNetworkContainersResponse = append (getNetworkContainersResponse , getNetworkContainerResponse )
655+ return getNetworkContainersResponse , nil
656+ }
657+ }
658+ default :
659+ getNetworkContainersResponse := []cns.GetNetworkContainerResponse {}
660+ response := cns.Response {
661+ ReturnCode : types .UnsupportedOrchestratorType ,
662+ Message : fmt .Sprintf ("Invalid orchestrator type %v" , service .state .OrchestratorType ),
663+ }
664+
665+ getNetworkContainerResponse .Response = response
666+ getNetworkContainersResponse = append (getNetworkContainersResponse , getNetworkContainerResponse )
667+ return getNetworkContainersResponse , nil
668+ }
669+
670+ getNetworkContainersResponse := []cns.GetNetworkContainerResponse {}
671+ getCreateNetworkContainersRequest := []cns.CreateNetworkContainerRequest {}
672+
673+ for _ , ncid := range ncs {
674+ containerStatus := service .state .ContainerStatus
675+ containerDetails , ok := containerStatus [ncid ]
676+ if ! ok {
677+ response := cns.Response {
678+ ReturnCode : types .UnknownContainerID ,
679+ Message : "NetworkContainer doesn't exist." ,
680+ }
681+
682+ getNetworkContainerResponse .Response = response
683+ getNetworkContainersResponse = append (getNetworkContainersResponse , getNetworkContainerResponse )
684+ continue
685+ }
686+
687+ savedReq := containerDetails .CreateNetworkContainerRequest
688+ getNetworkContainerResponse = cns.GetNetworkContainerResponse {
689+ NetworkContainerID : savedReq .NetworkContainerid ,
690+ IPConfiguration : savedReq .IPConfiguration ,
691+ Routes : savedReq .Routes ,
692+ CnetAddressSpace : savedReq .CnetAddressSpace ,
693+ MultiTenancyInfo : savedReq .MultiTenancyInfo ,
694+ PrimaryInterfaceIdentifier : savedReq .PrimaryInterfaceIdentifier ,
695+ LocalIPConfiguration : savedReq .LocalIPConfiguration ,
696+ AllowHostToNCCommunication : savedReq .AllowHostToNCCommunication ,
697+ AllowNCToHostCommunication : savedReq .AllowNCToHostCommunication ,
698+ NetworkInterfaceInfo : savedReq .NetworkInterfaceInfo ,
699+ }
700+
701+ // If the NC version check wasn't skipped, take into account the VFP programming status when returning the response
702+ if ! skipNCVersionCheck {
703+ if ! containerDetails .VfpUpdateComplete {
704+ getNetworkContainerResponse .Response = cns.Response {
705+ ReturnCode : types .NetworkContainerVfpProgramPending ,
706+ Message : "NetworkContainer VFP programming is pending" ,
707+ }
708+ }
709+ }
710+ getNetworkContainersResponse = append (getNetworkContainersResponse , getNetworkContainerResponse )
711+ getCreateNetworkContainersRequest = append (getCreateNetworkContainersRequest , savedReq )
712+ }
713+
714+ logger .Printf ("getNetworkContainersResponses are %+v" , getNetworkContainersResponse )
715+
716+ return getNetworkContainersResponse , getCreateNetworkContainersRequest
717+ }
718+
553719// restoreNetworkState restores Network state that existed before reboot.
554720func (service * HTTPRestService ) restoreNetworkState () error {
555721 logger .Printf ("[Azure CNS] Enter Restoring Network State" )
0 commit comments