// GetServerSupportedSMPatchVersionFromFactory is a wrapper of GetServerSupportedSMPatchVersion(), // It takes a Factory, returns the max version the server supports. func GetServerSupportedSMPatchVersionFromFactory(f Factory) (strategicpatch.StrategicMergePatchVersion, error) { clientSet, err := f.ClientSet() if err != nil { return strategicpatch.Unknown, err } return strategicpatch.GetServerSupportedSMPatchVersion(clientSet.Discovery()) }
func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error { smPatchVersion, err := strategicpatch.GetServerSupportedSMPatchVersion(nsu.kubeClient.Discovery()) if err != nil { return err } nodesToUpdate := nsu.actualStateOfWorld.GetVolumesToReportAttached() for nodeName, attachedVolumes := range nodesToUpdate { nodeObj, exists, err := nsu.nodeInformer.GetStore().GetByKey(string(nodeName)) if nodeObj == nil || !exists || err != nil { // If node does not exist, its status cannot be updated, log error and // reset flag statusUpdateNeeded back to true to indicate this node status // needs to be udpated again glog.V(2).Infof( "Could not update node status. Failed to find node %q in NodeInformer cache. %v", nodeName, err) nsu.actualStateOfWorld.SetNodeStatusUpdateNeeded(nodeName) continue } clonedNode, err := conversion.NewCloner().DeepCopy(nodeObj) if err != nil { return fmt.Errorf("error cloning node %q: %v", nodeName, err) } node, ok := clonedNode.(*api.Node) if !ok || node == nil { return fmt.Errorf( "failed to cast %q object %#v to Node", nodeName, clonedNode) } oldData, err := json.Marshal(node) if err != nil { return fmt.Errorf( "failed to Marshal oldData for node %q. %v", nodeName, err) } node.Status.VolumesAttached = attachedVolumes newData, err := json.Marshal(node) if err != nil { return fmt.Errorf( "failed to Marshal newData for node %q. %v", nodeName, err) } patchBytes, err := strategicpatch.CreateStrategicMergePatch(oldData, newData, node, smPatchVersion) if err != nil { return fmt.Errorf( "failed to CreateStrategicMergePatch for node %q. %v", nodeName, err) } _, err = nsu.kubeClient.Core().Nodes().PatchStatus(string(nodeName), patchBytes) if err != nil { // If update node status fails, reset flag statusUpdateNeeded back to true // to indicate this node status needs to be udpated again nsu.actualStateOfWorld.SetNodeStatusUpdateNeeded(nodeName) return fmt.Errorf( "failed to kubeClient.Core().Nodes().Patch for node %q. %v", nodeName, err) } glog.V(2).Infof( "Updating status for node %q succeeded. patchBytes: %q VolumesAttached: %v", nodeName, string(patchBytes), node.Status.VolumesAttached) } return nil }