Merge pull request #5008 from ddysher/external-id

Move Node.ExternalID to CloudNodes()
This commit is contained in:
Eric Tune 2015-03-04 12:30:38 -08:00
commit 0059c39211
2 changed files with 28 additions and 23 deletions

View File

@ -82,13 +82,20 @@ func NewNodeController(
// Run creates initial node list and start syncing instances from cloudprovider if any. // Run creates initial node list and start syncing instances from cloudprovider if any.
// It also starts syncing cluster node status. // It also starts syncing cluster node status.
// 1. RegisterNodes() is called only once to register all initial nodes (from cloudprovider
// or from command line flag). To make cluster bootstrap faster, node controller populates
// node addresses.
// 2. SyncCloud() is called periodically (if enabled) to sync instances from cloudprovider.
// Node created here will only have specs.
// 3. SyncNodeStatus() is called periodically (if enabled) to sync node status for nodes in
// k8s cluster.
func (s *NodeController) Run(period time.Duration, syncNodeList, syncNodeStatus bool) { func (s *NodeController) Run(period time.Duration, syncNodeList, syncNodeStatus bool) {
// Register intial set of nodes with their status set. // Register intial set of nodes with their status set.
var nodes *api.NodeList var nodes *api.NodeList
var err error var err error
if s.isRunningCloudProvider() { if s.isRunningCloudProvider() {
if syncNodeList { if syncNodeList {
nodes, err = s.CloudNodes() nodes, err = s.GetCloudNodesWithSpec()
if err != nil { if err != nil {
glog.Errorf("Error loading initial node from cloudprovider: %v", err) glog.Errorf("Error loading initial node from cloudprovider: %v", err)
} }
@ -96,7 +103,7 @@ func (s *NodeController) Run(period time.Duration, syncNodeList, syncNodeStatus
nodes = &api.NodeList{} nodes = &api.NodeList{}
} }
} else { } else {
nodes, err = s.StaticNodes() nodes, err = s.GetStaticNodesWithSpec()
if err != nil { if err != nil {
glog.Errorf("Error loading initial static nodes: %v", err) glog.Errorf("Error loading initial static nodes: %v", err)
} }
@ -167,11 +174,7 @@ func (s *NodeController) RegisterNodes(nodes *api.NodeList, retryCount int, retr
// SyncCloud synchronizes the list of instances from cloudprovider to master server. // SyncCloud synchronizes the list of instances from cloudprovider to master server.
func (s *NodeController) SyncCloud() error { func (s *NodeController) SyncCloud() error {
matches, err := s.CloudNodes() matches, err := s.GetCloudNodesWithSpec()
if err != nil {
return err
}
matches, err = s.PopulateIPs(matches)
if err != nil { if err != nil {
return err return err
} }
@ -276,12 +279,6 @@ func (s *NodeController) PopulateIPs(nodes *api.NodeList) (*api.NodeList, error)
} else { } else {
node.Status.HostIP = hostIP.String() node.Status.HostIP = hostIP.String()
} }
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
}
} }
} else { } else {
for i := range nodes.Items { for i := range nodes.Items {
@ -398,9 +395,10 @@ func (s *NodeController) deletePods(nodeID string) error {
return nil return nil
} }
// StaticNodes constructs and returns api.NodeList for static nodes. If error // GetStaticNodesWithSpec constructs and returns api.NodeList for static nodes. If error
// occurs, an empty NodeList will be returned with a non-nil error info. // occurs, an empty NodeList will be returned with a non-nil error info. The
func (s *NodeController) StaticNodes() (*api.NodeList, error) { // method only constructs spec fields for nodes.
func (s *NodeController) GetStaticNodesWithSpec() (*api.NodeList, error) {
result := &api.NodeList{} result := &api.NodeList{}
for _, nodeID := range s.nodes { for _, nodeID := range s.nodes {
node := api.Node{ node := api.Node{
@ -412,9 +410,10 @@ func (s *NodeController) StaticNodes() (*api.NodeList, error) {
return result, nil return result, nil
} }
// CloudNodes constructs and returns api.NodeList from cloudprovider. If error // GetCloudNodesWithSpec constructs and returns api.NodeList from cloudprovider. If error
// occurs, an empty NodeList will be returned with a non-nil error info. // occurs, an empty NodeList will be returned with a non-nil error info. The
func (s *NodeController) CloudNodes() (*api.NodeList, error) { // method only constructs spec fields for nodes.
func (s *NodeController) GetCloudNodesWithSpec() (*api.NodeList, error) {
result := &api.NodeList{} result := &api.NodeList{}
instances, ok := s.cloud.Instances() instances, ok := s.cloud.Instances()
if !ok { if !ok {
@ -437,6 +436,12 @@ func (s *NodeController) CloudNodes() (*api.NodeList, error) {
if resources != nil { if resources != nil {
node.Spec.Capacity = resources.Capacity 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) result.Items = append(result.Items, node)
} }
return result, nil return result, nil

View File

@ -254,7 +254,7 @@ func TestRegisterNodes(t *testing.T) {
} }
} }
func TestCreateStaticNodes(t *testing.T) { func TestCreateGetStaticNodesWithSpec(t *testing.T) {
table := []struct { table := []struct {
machines []string machines []string
expectedNodes *api.NodeList expectedNodes *api.NodeList
@ -296,7 +296,7 @@ func TestCreateStaticNodes(t *testing.T) {
for _, item := range table { for _, item := range table {
nodeController := NewNodeController(nil, "", item.machines, &api.NodeResources{}, nil, nil, 10, time.Minute) nodeController := NewNodeController(nil, "", item.machines, &api.NodeResources{}, nil, nil, 10, time.Minute)
nodes, err := nodeController.StaticNodes() nodes, err := nodeController.GetStaticNodesWithSpec()
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -306,7 +306,7 @@ func TestCreateStaticNodes(t *testing.T) {
} }
} }
func TestCreateCloudNodes(t *testing.T) { func TestCreateGetCloudNodesWithSpec(t *testing.T) {
resourceList := api.ResourceList{ resourceList := api.ResourceList{
api.ResourceCPU: *resource.NewMilliQuantity(1000, resource.DecimalSI), api.ResourceCPU: *resource.NewMilliQuantity(1000, resource.DecimalSI),
api.ResourceMemory: *resource.NewQuantity(3000, resource.DecimalSI), api.ResourceMemory: *resource.NewQuantity(3000, resource.DecimalSI),
@ -357,7 +357,7 @@ func TestCreateCloudNodes(t *testing.T) {
for _, item := range table { for _, item := range table {
nodeController := NewNodeController(item.fakeCloud, ".*", nil, &api.NodeResources{}, nil, nil, 10, time.Minute) nodeController := NewNodeController(item.fakeCloud, ".*", nil, &api.NodeResources{}, nil, nil, 10, time.Minute)
nodes, err := nodeController.CloudNodes() nodes, err := nodeController.GetCloudNodesWithSpec()
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }