func NewFakeAWSServices() *FakeAWSServices { s := &FakeAWSServices{} s.availabilityZone = "us-east-1a" s.ec2 = &FakeEC2{aws: s} s.elb = &FakeELB{aws: s} s.asg = &FakeASG{aws: s} s.metadata = &FakeMetadata{aws: s} s.networkInterfacesMacs = []string{"aa:bb:cc:dd:ee:00", "aa:bb:cc:dd:ee:01"} s.networkInterfacesVpcIDs = []string{"vpc-mac0", "vpc-mac1"} s.instanceId = "i-self" s.privateDnsName = "ip-172-20-0-100.ec2.internal" var selfInstance ec2.Instance selfInstance.InstanceId = &s.instanceId selfInstance.PrivateDnsName = &s.privateDnsName s.instances = []*ec2.Instance{&selfInstance} var tag ec2.Tag tag.Key = aws.String(TagNameKubernetesCluster) tag.Value = aws.String(TestClusterId) selfInstance.Tags = []*ec2.Tag{&tag} return s }
func (i *EC2IaaS) waitForDnsName(ec2Inst *ec2.EC2, instance *ec2.Instance) (*ec2.Instance, error) { rawWait, _ := i.base.GetConfigString("wait-timeout") maxWaitTime, _ := strconv.Atoi(rawWait) if maxWaitTime == 0 { maxWaitTime = 300 } q, err := queue.Queue() if err != nil { return nil, err } taskName := fmt.Sprintf("ec2-wait-machine-%s", i.base.IaaSName) waitDuration := time.Duration(maxWaitTime) * time.Second job, err := q.EnqueueWait(taskName, monsterqueue.JobParams{ "region": ec2Inst.Config.Region, "endpoint": ec2Inst.Config.Endpoint, "machineId": *instance.InstanceId, "timeout": maxWaitTime, }, waitDuration) if err != nil { if err == monsterqueue.ErrQueueWaitTimeout { return nil, fmt.Errorf("ec2: time out after %v waiting for instance %s to start", waitDuration, *instance.InstanceId) } return nil, err } result, err := job.Result() if err != nil { return nil, err } instance.PublicDnsName = aws.String(result.(string)) return instance, nil }
func NewFakeAWSServices() *FakeAWSServices { s := &FakeAWSServices{} s.availabilityZone = "us-east-1a" s.ec2 = &FakeEC2{aws: s} s.elb = &FakeELB{aws: s} s.metadata = &FakeMetadata{aws: s} s.instanceId = "i-self" var selfInstance ec2.Instance selfInstance.InstanceID = &s.instanceId s.instances = []*ec2.Instance{&selfInstance} var tag ec2.Tag tag.Key = aws.String(TagNameKubernetesCluster) tag.Value = aws.String(TestClusterId) selfInstance.Tags = []*ec2.Tag{&tag} return s }
func TestFindInstanceByNodeNameExcludesTerminatedInstances(t *testing.T) { awsServices := NewFakeAWSServices() nodeName := "my-dns.internal" var tag ec2.Tag tag.Key = aws.String(TagNameKubernetesCluster) tag.Value = aws.String(TestClusterId) tags := []*ec2.Tag{&tag} var runningInstance ec2.Instance runningInstance.InstanceId = aws.String("i-running") runningInstance.PrivateDnsName = aws.String(nodeName) runningInstance.State = &ec2.InstanceState{Code: aws.Int64(16), Name: aws.String("running")} runningInstance.Tags = tags var terminatedInstance ec2.Instance terminatedInstance.InstanceId = aws.String("i-terminated") terminatedInstance.PrivateDnsName = aws.String(nodeName) terminatedInstance.State = &ec2.InstanceState{Code: aws.Int64(48), Name: aws.String("terminated")} terminatedInstance.Tags = tags instances := []*ec2.Instance{&terminatedInstance, &runningInstance} awsServices.instances = append(awsServices.instances, instances...) c, err := newAWSCloud(strings.NewReader("[global]"), awsServices) if err != nil { t.Errorf("Error building aws cloud: %v", err) return } instance, err := c.findInstanceByNodeName(nodeName) if err != nil { t.Errorf("Failed to find instance: %v", err) return } if *instance.InstanceId != "i-running" { t.Errorf("Expected running instance but got %v", *instance.InstanceId) } }
func TestGetResources(t *testing.T) { var instance0 ec2.Instance var instance1 ec2.Instance var instance2 ec2.Instance //0 instance0.InstanceID = aws.String("m3.medium") instance0.InstanceType = aws.String("m3.medium") state0 := ec2.InstanceState{ Name: aws.String("running"), } instance0.State = &state0 //1 instance1.InstanceID = aws.String("r3.8xlarge") instance1.InstanceType = aws.String("r3.8xlarge") state1 := ec2.InstanceState{ Name: aws.String("running"), } instance1.State = &state1 //2 instance2.InstanceID = aws.String("unknown.type") instance2.InstanceType = aws.String("unknown.type") state2 := ec2.InstanceState{ Name: aws.String("running"), } instance2.State = &state2 instances := []*ec2.Instance{&instance0, &instance1, &instance2} aws1 := mockInstancesResp(instances) res1, err1 := aws1.GetNodeResources("m3.medium") if err1 != nil { t.Errorf("Should not error when instance type found: %v", err1) } e1 := &api.NodeResources{ Capacity: api.ResourceList{ api.ResourceCPU: *resource.NewMilliQuantity(int64(3.0*1000), resource.DecimalSI), api.ResourceMemory: *resource.NewQuantity(int64(3.75*1024*1024*1024), resource.BinarySI), }, } if !reflect.DeepEqual(e1, res1) { t.Errorf("Expected %v, got %v", e1, res1) } res2, err2 := aws1.GetNodeResources("r3.8xlarge") if err2 != nil { t.Errorf("Should not error when instance type found: %v", err2) } e2 := &api.NodeResources{ Capacity: api.ResourceList{ api.ResourceCPU: *resource.NewMilliQuantity(int64(104.0*1000), resource.DecimalSI), api.ResourceMemory: *resource.NewQuantity(int64(244.0*1024*1024*1024), resource.BinarySI), }, } if !reflect.DeepEqual(e2, res2) { t.Errorf("Expected %v, got %v", e2, res2) } res3, err3 := aws1.GetNodeResources("unknown.type") if err3 != nil { t.Errorf("Should not error when unknown instance type") } if res3 != nil { t.Errorf("Should return nil resources when unknown instance type") } }
func TestNodeAddresses(t *testing.T) { // Note these instances have the same name // (we test that this produces an error) var instance0 ec2.Instance var instance1 ec2.Instance //0 instance0.InstanceID = aws.String("instance-same") instance0.PrivateIPAddress = aws.String("192.168.0.1") instance0.PublicIPAddress = aws.String("1.2.3.4") instance0.InstanceType = aws.String("c3.large") state0 := ec2.InstanceState{ Name: aws.String("running"), } instance0.State = &state0 //1 instance1.InstanceID = aws.String("instance-same") instance1.PrivateIPAddress = aws.String("192.168.0.2") instance1.InstanceType = aws.String("c3.large") state1 := ec2.InstanceState{ Name: aws.String("running"), } instance1.State = &state1 instances := []*ec2.Instance{&instance0, &instance1} aws1 := mockInstancesResp([]*ec2.Instance{}) _, err1 := aws1.NodeAddresses("instance-mismatch") if err1 == nil { t.Errorf("Should error when no instance found") } aws2 := mockInstancesResp(instances) _, err2 := aws2.NodeAddresses("instance-same") if err2 == nil { t.Errorf("Should error when multiple instances found") } aws3 := mockInstancesResp(instances[0:1]) addrs3, err3 := aws3.NodeAddresses("instance-same") if err3 != nil { t.Errorf("Should not error when instance found") } if len(addrs3) != 3 { t.Errorf("Should return exactly 3 NodeAddresses") } testHasNodeAddress(t, addrs3, api.NodeInternalIP, "192.168.0.1") testHasNodeAddress(t, addrs3, api.NodeLegacyHostIP, "192.168.0.1") testHasNodeAddress(t, addrs3, api.NodeExternalIP, "1.2.3.4") }
func TestList(t *testing.T) { // TODO this setup is not very clean and could probably be improved var instance0 ec2.Instance var instance1 ec2.Instance var instance2 ec2.Instance var instance3 ec2.Instance //0 tag0 := ec2.Tag{ Key: aws.String("Name"), Value: aws.String("foo"), } instance0.Tags = []*ec2.Tag{&tag0} instance0.InstanceID = aws.String("instance0") state0 := ec2.InstanceState{ Name: aws.String("running"), } instance0.State = &state0 //1 tag1 := ec2.Tag{ Key: aws.String("Name"), Value: aws.String("bar"), } instance1.Tags = []*ec2.Tag{&tag1} instance1.InstanceID = aws.String("instance1") state1 := ec2.InstanceState{ Name: aws.String("running"), } instance1.State = &state1 //2 tag2 := ec2.Tag{ Key: aws.String("Name"), Value: aws.String("baz"), } instance2.Tags = []*ec2.Tag{&tag2} instance2.InstanceID = aws.String("instance2") state2 := ec2.InstanceState{ Name: aws.String("running"), } instance2.State = &state2 //3 tag3 := ec2.Tag{ Key: aws.String("Name"), Value: aws.String("quux"), } instance3.Tags = []*ec2.Tag{&tag3} instance3.InstanceID = aws.String("instance3") state3 := ec2.InstanceState{ Name: aws.String("running"), } instance3.State = &state3 instances := []*ec2.Instance{&instance0, &instance1, &instance2, &instance3} aws := mockInstancesResp(instances) table := []struct { input string expect []string }{ {"blahonga", []string{}}, {"quux", []string{"instance3"}}, {"a", []string{"instance1", "instance2"}}, } for _, item := range table { result, err := aws.List(item.input) if err != nil { t.Errorf("Expected call with %v to succeed, failed with %s", item.input, err) } if e, a := item.expect, result; !reflect.DeepEqual(e, a) { t.Errorf("Expected %v, got %v", e, a) } } }
func TestNodeAddresses(t *testing.T) { // Note these instances have the same name // (we test that this produces an error) var instance0 ec2.Instance var instance1 ec2.Instance var instance2 ec2.Instance //0 instance0.InstanceId = aws.String("i-self") instance0.PrivateDnsName = aws.String("instance-same.ec2.internal") instance0.PrivateIpAddress = aws.String("192.168.0.1") instance0.PublicIpAddress = aws.String("1.2.3.4") instance0.InstanceType = aws.String("c3.large") state0 := ec2.InstanceState{ Name: aws.String("running"), } instance0.State = &state0 //1 instance1.InstanceId = aws.String("i-self") instance1.PrivateDnsName = aws.String("instance-same.ec2.internal") instance1.PrivateIpAddress = aws.String("192.168.0.2") instance1.InstanceType = aws.String("c3.large") state1 := ec2.InstanceState{ Name: aws.String("running"), } instance1.State = &state1 //2 instance2.InstanceId = aws.String("i-self") instance2.PrivateDnsName = aws.String("instance-other.ec2.internal") instance2.PrivateIpAddress = aws.String("192.168.0.1") instance2.PublicIpAddress = aws.String("1.2.3.4") instance2.InstanceType = aws.String("c3.large") state2 := ec2.InstanceState{ Name: aws.String("running"), } instance2.State = &state2 instances := []*ec2.Instance{&instance0, &instance1, &instance2} aws1, _ := mockInstancesResp([]*ec2.Instance{}) _, err1 := aws1.NodeAddresses("instance-mismatch.ec2.internal") if err1 == nil { t.Errorf("Should error when no instance found") } aws2, _ := mockInstancesResp(instances) _, err2 := aws2.NodeAddresses("instance-same.ec2.internal") if err2 == nil { t.Errorf("Should error when multiple instances found") } aws3, _ := mockInstancesResp(instances[0:1]) addrs3, err3 := aws3.NodeAddresses("instance-same.ec2.internal") if err3 != nil { t.Errorf("Should not error when instance found") } if len(addrs3) != 3 { t.Errorf("Should return exactly 3 NodeAddresses") } testHasNodeAddress(t, addrs3, api.NodeInternalIP, "192.168.0.1") testHasNodeAddress(t, addrs3, api.NodeLegacyHostIP, "192.168.0.1") testHasNodeAddress(t, addrs3, api.NodeExternalIP, "1.2.3.4") aws4, fakeServices := mockInstancesResp([]*ec2.Instance{}) fakeServices.externalIP = "2.3.4.5" fakeServices.internalIP = "192.168.0.2" aws4.selfAWSInstance = &awsInstance{nodeName: fakeServices.instanceId} addrs4, err4 := aws4.NodeAddresses(fakeServices.instanceId) if err4 != nil { t.Errorf("unexpected error: %v", err4) } testHasNodeAddress(t, addrs4, api.NodeInternalIP, "192.168.0.2") testHasNodeAddress(t, addrs4, api.NodeExternalIP, "2.3.4.5") }
func TestFindInstancesByNodeName(t *testing.T) { awsServices := NewFakeAWSServices() nodeNameOne := "my-dns.internal" nodeNameTwo := "my-dns-two.internal" var tag ec2.Tag tag.Key = aws.String(TagNameKubernetesCluster) tag.Value = aws.String(TestClusterId) tags := []*ec2.Tag{&tag} var runningInstance ec2.Instance runningInstance.InstanceId = aws.String("i-running") runningInstance.PrivateDnsName = aws.String(nodeNameOne) runningInstance.State = &ec2.InstanceState{Code: aws.Int64(16), Name: aws.String("running")} runningInstance.Tags = tags var secondInstance ec2.Instance secondInstance.InstanceId = aws.String("i-running") secondInstance.PrivateDnsName = aws.String(nodeNameTwo) secondInstance.State = &ec2.InstanceState{Code: aws.Int64(48), Name: aws.String("running")} secondInstance.Tags = tags var terminatedInstance ec2.Instance terminatedInstance.InstanceId = aws.String("i-terminated") terminatedInstance.PrivateDnsName = aws.String(nodeNameOne) terminatedInstance.State = &ec2.InstanceState{Code: aws.Int64(48), Name: aws.String("terminated")} terminatedInstance.Tags = tags instances := []*ec2.Instance{&secondInstance, &runningInstance, &terminatedInstance} awsServices.instances = append(awsServices.instances, instances...) c, err := newAWSCloud(strings.NewReader("[global]"), awsServices) if err != nil { t.Errorf("Error building aws cloud: %v", err) return } nodeNames := []string{nodeNameOne} returnedInstances, errr := c.getInstancesByNodeNames(nodeNames) if errr != nil { t.Errorf("Failed to find instance: %v", err) return } if len(returnedInstances) != 1 { t.Errorf("Expected a single isntance but found: %v", returnedInstances) } if *returnedInstances[0].PrivateDnsName != nodeNameOne { t.Errorf("Expected node name %v but got %v", nodeNameOne, returnedInstances[0].PrivateDnsName) } }
func TestNodeAddresses(t *testing.T) { // Note these instances have the same name // (we test that this produces an error) var instance0 ec2.Instance var instance1 ec2.Instance var instance2 ec2.Instance //0 instance0.InstanceId = aws.String("i-0") instance0.PrivateDnsName = aws.String("instance-same.ec2.internal") instance0.PrivateIpAddress = aws.String("192.168.0.1") instance0.PublicIpAddress = aws.String("1.2.3.4") instance0.InstanceType = aws.String("c3.large") instance0.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} state0 := ec2.InstanceState{ Name: aws.String("running"), } instance0.State = &state0 //1 instance1.InstanceId = aws.String("i-1") instance1.PrivateDnsName = aws.String("instance-same.ec2.internal") instance1.PrivateIpAddress = aws.String("192.168.0.2") instance1.InstanceType = aws.String("c3.large") instance1.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} state1 := ec2.InstanceState{ Name: aws.String("running"), } instance1.State = &state1 //2 instance2.InstanceId = aws.String("i-2") instance2.PrivateDnsName = aws.String("instance-other.ec2.internal") instance2.PrivateIpAddress = aws.String("192.168.0.1") instance2.PublicIpAddress = aws.String("1.2.3.4") instance2.InstanceType = aws.String("c3.large") instance2.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} state2 := ec2.InstanceState{ Name: aws.String("running"), } instance2.State = &state2 instances := []*ec2.Instance{&instance0, &instance1, &instance2} aws1, _ := mockInstancesResp(&instance0, []*ec2.Instance{&instance0}) _, err1 := aws1.NodeAddresses("instance-mismatch.ec2.internal") if err1 == nil { t.Errorf("Should error when no instance found") } aws2, _ := mockInstancesResp(&instance2, instances) _, err2 := aws2.NodeAddresses("instance-same.ec2.internal") if err2 == nil { t.Errorf("Should error when multiple instances found") } aws3, _ := mockInstancesResp(&instance0, instances[0:1]) addrs3, err3 := aws3.NodeAddresses("instance-same.ec2.internal") if err3 != nil { t.Errorf("Should not error when instance found") } if len(addrs3) != 3 { t.Errorf("Should return exactly 3 NodeAddresses") } testHasNodeAddress(t, addrs3, api.NodeInternalIP, "192.168.0.1") testHasNodeAddress(t, addrs3, api.NodeLegacyHostIP, "192.168.0.1") testHasNodeAddress(t, addrs3, api.NodeExternalIP, "1.2.3.4") // Fetch from metadata aws4, fakeServices := mockInstancesResp(&instance0, []*ec2.Instance{&instance0}) fakeServices.selfInstance.PublicIpAddress = aws.String("2.3.4.5") fakeServices.selfInstance.PrivateIpAddress = aws.String("192.168.0.2") addrs4, err4 := aws4.NodeAddresses(*instance0.PrivateDnsName) if err4 != nil { t.Errorf("unexpected error: %v", err4) } testHasNodeAddress(t, addrs4, api.NodeInternalIP, "192.168.0.2") testHasNodeAddress(t, addrs4, api.NodeExternalIP, "2.3.4.5") }