github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/oci/instance_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package oci_test 5 6 import ( 7 "context" 8 "strings" 9 10 gomock "github.com/golang/mock/gomock" 11 gc "gopkg.in/check.v1" 12 13 ociCore "github.com/oracle/oci-go-sdk/core" 14 15 "github.com/juju/juju/core/instance" 16 "github.com/juju/juju/core/status" 17 "github.com/juju/juju/network" 18 "github.com/juju/juju/provider/oci" 19 ) 20 21 type instanceSuite struct { 22 commonSuite 23 } 24 25 var _ = gc.Suite(&instanceSuite{}) 26 27 func (i *instanceSuite) SetUpTest(c *gc.C) { 28 i.commonSuite.SetUpTest(c) 29 } 30 31 func (i *instanceSuite) TestNewInstance(c *gc.C) { 32 _, err := oci.NewInstance(ociCore.Instance{}, i.env) 33 c.Assert(err, gc.ErrorMatches, "Instance response does not contain an ID") 34 } 35 36 func (i *instanceSuite) TestId(c *gc.C) { 37 inst, err := oci.NewInstance(*i.ociInstance, i.env) 38 c.Assert(err, gc.IsNil) 39 id := inst.Id() 40 c.Assert(id, gc.Equals, instance.Id(i.testInstanceID)) 41 } 42 43 func (i *instanceSuite) TestStatus(c *gc.C) { 44 ctrl := i.patchEnv(c) 45 defer ctrl.Finish() 46 47 i.compute.EXPECT().GetInstance(gomock.Any(), gomock.Any()).Return(ociCore.GetInstanceResponse{Instance: *i.ociInstance}, nil) 48 inst, err := oci.NewInstance(*i.ociInstance, i.env) 49 c.Assert(err, gc.IsNil) 50 51 instStatus := inst.Status(nil) 52 expectedStatus := instance.Status{ 53 Status: status.Running, 54 Message: strings.ToLower(string(ociCore.InstanceLifecycleStateRunning)), 55 } 56 c.Assert(instStatus, gc.DeepEquals, expectedStatus) 57 58 // Change lifecycle and check again 59 i.ociInstance.LifecycleState = ociCore.InstanceLifecycleStateTerminating 60 61 i.compute.EXPECT().GetInstance(gomock.Any(), gomock.Any()).Return(ociCore.GetInstanceResponse{Instance: *i.ociInstance}, nil) 62 inst, err = oci.NewInstance(*i.ociInstance, i.env) 63 c.Assert(err, gc.IsNil) 64 65 instStatus = inst.Status(nil) 66 expectedStatus = instance.Status{ 67 Status: status.Running, 68 Message: strings.ToLower(string(ociCore.InstanceLifecycleStateTerminating)), 69 } 70 c.Assert(instStatus, gc.DeepEquals, expectedStatus) 71 } 72 73 func (i *instanceSuite) TestStatusNilRawInstanceResponse(c *gc.C) { 74 ctrl := i.patchEnv(c) 75 defer ctrl.Finish() 76 77 request, response := makeGetInstanceRequestResponse( 78 ociCore.Instance{ 79 CompartmentId: &i.testCompartment, 80 AvailabilityDomain: makeStringPointer("QXay:PHX-AD-3"), 81 Id: &i.testInstanceID, 82 Region: makeStringPointer("us-phoenix-1"), 83 Shape: makeStringPointer("VM.Standard1.1"), 84 DisplayName: makeStringPointer("fake"), 85 FreeformTags: i.tags, 86 LifecycleState: ociCore.InstanceLifecycleStateRunning, 87 }) 88 89 i.compute.EXPECT().GetInstance(context.Background(), request).Return(response, nil) 90 91 inst, err := oci.NewInstance(*i.ociInstance, i.env) 92 c.Assert(err, gc.IsNil) 93 94 instStatus := inst.Status(nil) 95 expectedStatus := instance.Status{ 96 Status: status.Running, 97 Message: strings.ToLower(string(ociCore.InstanceLifecycleStateRunning)), 98 } 99 c.Assert(instStatus, gc.DeepEquals, expectedStatus) 100 } 101 102 func (i *instanceSuite) setupListVnicsExpectations(instanceId, vnicID string) { 103 attachRequest, attachResponse := makeListVnicAttachmentsRequestResponse( 104 []ociCore.VnicAttachment{ 105 { 106 Id: makeStringPointer("fakeAttachmentId"), 107 AvailabilityDomain: makeStringPointer("fake"), 108 CompartmentId: makeStringPointer(i.testCompartment), 109 InstanceId: makeStringPointer(i.testInstanceID), 110 LifecycleState: ociCore.VnicAttachmentLifecycleStateAttached, 111 DisplayName: makeStringPointer("fakeAttachmentName"), 112 NicIndex: makeIntPointer(0), 113 VnicId: makeStringPointer(vnicID), 114 }, 115 }, 116 ) 117 118 // I am really sorry for this 119 trueBoolean := true 120 121 vnicRequest, vnicResponse := makeGetVnicRequestResponse([]ociCore.GetVnicResponse{ 122 { 123 Vnic: ociCore.Vnic{ 124 Id: makeStringPointer(vnicID), 125 PrivateIp: makeStringPointer("1.1.1.1"), 126 SubnetId: makeStringPointer("fakeSubnetId"), 127 DisplayName: makeStringPointer("fakeVnicName"), 128 MacAddress: makeStringPointer("11:11:11:11:11:11"), 129 PublicIp: makeStringPointer("2.2.2.2"), 130 IsPrimary: &trueBoolean, 131 LifecycleState: ociCore.VnicLifecycleStateAvailable, 132 }, 133 }, 134 }) 135 136 gomock.InOrder( 137 i.compute.EXPECT().ListVnicAttachments(context.Background(), attachRequest).Return(attachResponse, nil), 138 i.netw.EXPECT().GetVnic(context.Background(), vnicRequest[0]).Return(vnicResponse[0], nil), 139 ) 140 } 141 142 func (i *instanceSuite) TestAddresses(c *gc.C) { 143 ctrl := i.patchEnv(c) 144 defer ctrl.Finish() 145 146 vnicID := "fakeVnicId" 147 i.setupListVnicsExpectations(i.testInstanceID, vnicID) 148 149 inst, err := oci.NewInstance(*i.ociInstance, i.env) 150 c.Assert(err, gc.IsNil) 151 152 addresses, err := inst.Addresses(nil) 153 c.Assert(err, gc.IsNil) 154 c.Check(addresses, gc.HasLen, 2) 155 c.Check(addresses[0].Scope, gc.Equals, network.ScopeCloudLocal) 156 c.Check(addresses[1].Scope, gc.Equals, network.ScopePublic) 157 } 158 159 func (i *instanceSuite) TestAddressesNoPublicIP(c *gc.C) { 160 ctrl := i.patchEnv(c) 161 defer ctrl.Finish() 162 163 vnicID := "fakeVnicId" 164 i.setupListVnicsExpectations(i.testInstanceID, vnicID) 165 166 inst, err := oci.NewInstance(*i.ociInstance, i.env) 167 c.Assert(err, gc.IsNil) 168 169 addresses, err := inst.Addresses(nil) 170 c.Assert(err, gc.IsNil) 171 c.Check(addresses, gc.HasLen, 2) 172 c.Check(addresses[0].Scope, gc.Equals, network.ScopeCloudLocal) 173 c.Check(addresses[1].Scope, gc.Equals, network.ScopePublic) 174 }