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  }