// GetCloudNodesWithSpec constructs and returns api.NodeList from cloudprovider. If error // occurs, an empty NodeList will be returned with a non-nil error info. The // method only constructs spec fields for nodes. func (s *NodeController) GetCloudNodesWithSpec() (*api.NodeList, error) { result := &api.NodeList{} instances, ok := s.cloud.Instances() if !ok { return result, ErrCloudInstance } matches, err := instances.List(s.matchRE) if err != nil { return result, err } for i := range matches { node := api.Node{} node.Name = matches[i] resources, err := instances.GetNodeResources(matches[i]) if err != nil { return nil, err } if resources == nil { resources = s.staticResources } if resources != nil { node.Spec.Capacity = resources.Capacity } instanceID, err := instances.ExternalID(node.Name) if err != nil { glog.Errorf("error getting instance id for %s: %v", node.Name, err) } else { node.Spec.ExternalID = instanceID } result.Items = append(result.Items, node) } return result, nil }
// ValidateMinionUpdate tests to make sure a minion update can be applied. Modifies oldMinion. func ValidateMinionUpdate(oldMinion *api.Node, minion *api.Node) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} allErrs = append(allErrs, ValidateObjectMetaUpdate(&oldMinion.ObjectMeta, &minion.ObjectMeta).Prefix("metadata")...) // TODO: Enable the code once we have better api object.status update model. Currently, // anyone can update node status. // if !api.Semantic.DeepEqual(minion.Status, api.NodeStatus{}) { // allErrs = append(allErrs, errs.NewFieldInvalid("status", minion.Status, "status must be empty")) // } // TODO: move reset function to its own location // Ignore metadata changes now that they have been tested oldMinion.ObjectMeta = minion.ObjectMeta // Allow users to update capacity oldMinion.Spec.Capacity = minion.Spec.Capacity // Clear status oldMinion.Status = minion.Status // TODO: Add a 'real' ValidationError type for this error and provide print actual diffs. if !api.Semantic.DeepEqual(oldMinion, minion) { glog.V(4).Infof("Update failed validation %#v vs %#v", oldMinion, minion) allErrs = append(allErrs, fmt.Errorf("update contains more than labels or capacity changes")) } // TODO: validate Spec.Capacity return allErrs }
// ValidateMinionUpdate tests to make sure a minion update can be applied. Modifies oldMinion. func ValidateMinionUpdate(oldMinion *api.Node, minion *api.Node) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} if !api.Semantic.DeepEqual(minion.Status, api.NodeStatus{}) { allErrs = append(allErrs, errs.NewFieldInvalid("status", minion.Status, "status must be empty")) } // Allow users to update labels and capacity oldMinion.Labels = minion.Labels oldMinion.Spec.Capacity = minion.Spec.Capacity // Clear status oldMinion.Status = minion.Status if !api.Semantic.DeepEqual(oldMinion, minion) { glog.V(4).Infof("Update failed validation %#v vs %#v", oldMinion, minion) allErrs = append(allErrs, fmt.Errorf("update contains more than labels or capacity changes")) } return allErrs }