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  }