github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/caasoperatorprovisioner/worker_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasoperatorprovisioner_test 5 6 import ( 7 "io/ioutil" 8 "path/filepath" 9 "reflect" 10 11 "github.com/juju/errors" 12 jujutesting "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/version" 15 gc "gopkg.in/check.v1" 16 "gopkg.in/juju/names.v2" 17 "gopkg.in/juju/worker.v1" 18 "gopkg.in/juju/worker.v1/workertest" 19 20 "github.com/juju/juju/agent" 21 apicaasprovisioner "github.com/juju/juju/api/caasoperatorprovisioner" 22 "github.com/juju/juju/caas" 23 coretesting "github.com/juju/juju/testing" 24 "github.com/juju/juju/worker/caasoperatorprovisioner" 25 ) 26 27 var _ = gc.Suite(&CAASProvisionerSuite{}) 28 29 type CAASProvisionerSuite struct { 30 coretesting.BaseSuite 31 stub *jujutesting.Stub 32 33 provisionerFacade *mockProvisionerFacade 34 caasClient *mockBroker 35 agentConfig agent.Config 36 modelTag names.ModelTag 37 } 38 39 func (s *CAASProvisionerSuite) SetUpTest(c *gc.C) { 40 s.BaseSuite.SetUpTest(c) 41 42 s.stub = new(jujutesting.Stub) 43 s.provisionerFacade = newMockProvisionerFacade(s.stub) 44 s.caasClient = &mockBroker{} 45 s.agentConfig = &mockAgentConfig{} 46 s.modelTag = coretesting.ModelTag 47 } 48 49 func (s *CAASProvisionerSuite) waitForWorkerStubCalls(c *gc.C, expected []jujutesting.StubCall) { 50 waitForStubCalls(c, s.stub, expected) 51 } 52 53 func waitForStubCalls(c *gc.C, stub *jujutesting.Stub, expected []jujutesting.StubCall) { 54 var calls []jujutesting.StubCall 55 for a := coretesting.LongAttempt.Start(); a.Next(); { 56 calls = stub.Calls() 57 if reflect.DeepEqual(calls, expected) { 58 return 59 } 60 } 61 c.Fatalf("failed to see expected calls. saw: %v", calls) 62 } 63 64 func (s *CAASProvisionerSuite) assertWorker(c *gc.C) worker.Worker { 65 w, err := caasoperatorprovisioner.NewProvisionerWorker(caasoperatorprovisioner.Config{ 66 Facade: s.provisionerFacade, 67 Broker: s.caasClient, 68 ModelTag: s.modelTag, 69 AgentConfig: s.agentConfig, 70 }) 71 c.Assert(err, jc.ErrorIsNil) 72 expected := []jujutesting.StubCall{ 73 {"WatchApplications", nil}, 74 } 75 s.waitForWorkerStubCalls(c, expected) 76 s.stub.ResetCalls() 77 return w 78 } 79 80 func (s *CAASProvisionerSuite) TestWorkerStarts(c *gc.C) { 81 w := s.assertWorker(c) 82 workertest.CleanKill(c, w) 83 } 84 85 func (s *CAASProvisionerSuite) assertOperatorCreated(c *gc.C, exists bool) { 86 s.provisionerFacade.life = "alive" 87 s.provisionerFacade.applicationsWatcher.changes <- []string{"myapp"} 88 89 for a := coretesting.LongAttempt.Start(); a.Next(); { 90 if len(s.caasClient.Calls()) == 2 { 91 break 92 } 93 } 94 s.caasClient.CheckCallNames(c, "OperatorExists", "EnsureOperator") 95 c.Assert(s.caasClient.Calls(), gc.HasLen, 2) 96 97 args := s.caasClient.Calls()[0].Args 98 c.Assert(args, gc.HasLen, 1) 99 c.Assert(args[0], gc.Equals, "myapp") 100 101 args = s.caasClient.Calls()[1].Args 102 c.Assert(args, gc.HasLen, 3) 103 c.Assert(args[0], gc.Equals, "myapp") 104 c.Assert(args[1], gc.Equals, "/var/lib/juju") 105 c.Assert(args[2], gc.FitsTypeOf, &caas.OperatorConfig{}) 106 config := args[2].(*caas.OperatorConfig) 107 c.Assert(config.OperatorImagePath, gc.Equals, "juju-operator-image") 108 c.Assert(config.Version, gc.Equals, version.MustParse("2.99.0")) 109 c.Assert(config.ResourceTags, jc.DeepEquals, map[string]string{"fred": "mary"}) 110 c.Assert(config.CharmStorage, jc.DeepEquals, caas.CharmStorageParams{ 111 Provider: "kubernetes", 112 Size: uint64(1024), 113 ResourceTags: map[string]string{"foo": "bar"}, 114 Attributes: map[string]interface{}{"key": "value"}, 115 }) 116 117 if !exists { 118 agentFile := filepath.Join(c.MkDir(), "agent.config") 119 err := ioutil.WriteFile(agentFile, []byte(config.AgentConf), 0644) 120 c.Assert(err, jc.ErrorIsNil) 121 cfg, err := agent.ReadConfig(agentFile) 122 c.Assert(err, jc.ErrorIsNil) 123 c.Assert(cfg.CACert(), gc.Equals, coretesting.CACert) 124 addr, err := cfg.APIAddresses() 125 c.Assert(err, jc.ErrorIsNil) 126 c.Assert(addr, jc.DeepEquals, []string{"10.0.0.1:17070", "192.18.1.1:17070"}) 127 } else { 128 c.Assert(config.AgentConf, gc.IsNil) 129 } 130 131 for a := coretesting.LongAttempt.Start(); a.Next(); { 132 if len(s.provisionerFacade.stub.Calls()) > 0 { 133 break 134 } 135 } 136 137 if exists { 138 s.provisionerFacade.stub.CheckCallNames(c, "Life", "OperatorProvisioningInfo") 139 c.Assert(s.provisionerFacade.stub.Calls()[0].Args[0], gc.Equals, "myapp") 140 return 141 } 142 143 s.provisionerFacade.stub.CheckCallNames(c, "Life", "OperatorProvisioningInfo", "SetPasswords") 144 c.Assert(s.provisionerFacade.stub.Calls()[0].Args[0], gc.Equals, "myapp") 145 passwords := s.provisionerFacade.stub.Calls()[2].Args[0].([]apicaasprovisioner.ApplicationPassword) 146 147 c.Assert(passwords, gc.HasLen, 1) 148 c.Assert(passwords[0].Name, gc.Equals, "myapp") 149 c.Assert(passwords[0].Password, gc.Not(gc.Equals), "") 150 } 151 152 func (s *CAASProvisionerSuite) TestNewApplicationCreatesNewOperator(c *gc.C) { 153 w := s.assertWorker(c) 154 defer workertest.CleanKill(c, w) 155 156 s.assertOperatorCreated(c, false) 157 } 158 159 func (s *CAASProvisionerSuite) TestNewApplicationUpdatesOperator(c *gc.C) { 160 s.caasClient.operatorExists = true 161 w := s.assertWorker(c) 162 defer workertest.CleanKill(c, w) 163 164 s.assertOperatorCreated(c, true) 165 } 166 167 func (s *CAASProvisionerSuite) TestApplicationDeletedRemovesOperator(c *gc.C) { 168 w := s.assertWorker(c) 169 defer workertest.CleanKill(c, w) 170 171 s.assertOperatorCreated(c, false) 172 s.caasClient.ResetCalls() 173 s.provisionerFacade.stub.SetErrors(errors.NotFoundf("myapp")) 174 s.provisionerFacade.life = "dead" 175 s.provisionerFacade.applicationsWatcher.changes <- []string{"myapp"} 176 177 for a := coretesting.LongAttempt.Start(); a.Next(); { 178 if len(s.caasClient.Calls()) > 0 { 179 break 180 } 181 } 182 s.caasClient.CheckCallNames(c, "DeleteOperator") 183 c.Assert(s.caasClient.Calls()[0].Args[0], gc.Equals, "myapp") 184 }