func (p *ProjectOptions) UpdatePodNetwork(nsName string, action sdnapi.PodNetworkAction, args string) error { // Get corresponding NetNamespace for given namespace netns, err := p.Oclient.NetNamespaces().Get(nsName) if err != nil { return err } // Apply pod network change intent sdnapi.SetChangePodNetworkAnnotation(netns, action, args) // Update NetNamespace object _, err = p.Oclient.NetNamespaces().Update(netns) if err != nil { return err } // Validate SDN controller applied or rejected the intent backoff := wait.Backoff{ Steps: 15, Duration: 500 * time.Millisecond, Factor: 1.1, } return wait.ExponentialBackoff(backoff, func() (bool, error) { updatedNetNs, err := p.Oclient.NetNamespaces().Get(netns.NetName) if err != nil { return false, err } if _, _, err = sdnapi.GetChangePodNetworkAnnotation(updatedNetNs); err == sdnapi.ErrorPodNetworkAnnotationNotFound { return true, nil } // Pod network change not applied yet return false, nil }) }
func updateNetNamespace(osClient *osclient.Client, netns *sdnapi.NetNamespace, action sdnapi.PodNetworkAction, args string) (*sdnapi.NetNamespace, error) { sdnapi.SetChangePodNetworkAnnotation(netns, action, args) _, err := osClient.NetNamespaces().Update(netns) if err != nil { return nil, err } backoff := utilwait.Backoff{ Duration: 100 * time.Millisecond, Factor: 2, Steps: 5, } name := netns.Name err = utilwait.ExponentialBackoff(backoff, func() (bool, error) { netns, err = osClient.NetNamespaces().Get(name) if err != nil { return false, err } if _, _, err := sdnapi.GetChangePodNetworkAnnotation(netns); err == sdnapi.ErrorPodNetworkAnnotationNotFound { return true, nil } else { return false, nil } }) if err != nil { return nil, err } return netns, nil }
func (p *ProjectOptions) validateNetNamespace(netns *sdnapi.NetNamespace) error { // Timeout: 10 secs retries := 20 retryInterval := 500 * time.Millisecond for i := 0; i < retries; i++ { updatedNetNs, err := p.Oclient.NetNamespaces().Get(netns.NetName) if err != nil { return err } switch _, _, err := sdnapi.GetChangePodNetworkAnnotation(updatedNetNs); err { case sdnapi.ErrorPodNetworkAnnotationNotFound: return nil default: time.Sleep(retryInterval) } } return fmt.Errorf("failed to apply pod network change for project %q", netns.NetName) }
func (d *NetworkDiagnostic) makeNamespaceGlobal(nsName string) error { backoff := wait.Backoff{ Steps: 30, Duration: 500 * time.Millisecond, Factor: 1.1, } var netns *sdnapi.NetNamespace err := wait.ExponentialBackoff(backoff, func() (bool, error) { var err error netns, err = d.OSClient.NetNamespaces().Get(nsName) if kerrs.IsNotFound(err) { // NetNamespace not created yet return false, nil } else if err != nil { return false, err } return true, nil }) if err != nil { return err } sdnapi.SetChangePodNetworkAnnotation(netns, sdnapi.GlobalPodNetwork, "") if _, err = d.OSClient.NetNamespaces().Update(netns); err != nil { return err } return wait.ExponentialBackoff(backoff, func() (bool, error) { updatedNetNs, err := d.OSClient.NetNamespaces().Get(netns.NetName) if err != nil { return false, err } if _, _, err = sdnapi.GetChangePodNetworkAnnotation(updatedNetNs); err == sdnapi.ErrorPodNetworkAnnotationNotFound { return true, nil } // Pod network change not applied yet return false, nil }) }
func (vmap *masterVNIDMap) updateVNID(osClient *osclient.Client, netns *osapi.NetNamespace) error { action, args, err := osapi.GetChangePodNetworkAnnotation(netns) if err == osapi.ErrorPodNetworkAnnotationNotFound { // Nothing to update return nil } vmap.lock.Lock() defer vmap.lock.Unlock() netid, err := vmap.updateNetID(netns.NetName, action, args) if err != nil { return err } netns.NetID = netid osapi.DeleteChangePodNetworkAnnotation(netns) if _, err := osClient.NetNamespaces().Update(netns); err != nil { return err } return nil }