github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/devices_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/state"
    11  )
    12  
    13  type DevicesStateSuiteBase struct {
    14  	ConnSuite
    15  
    16  	series        string
    17  	st            *state.State
    18  	deviceBackend *state.DeviceBackend
    19  }
    20  
    21  func (s *DevicesStateSuiteBase) SetUpTest(c *gc.C) {
    22  	s.ConnSuite.SetUpTest(c)
    23  
    24  	if s.series == "kubernetes" {
    25  		s.st = s.Factory.MakeCAASModel(c, nil)
    26  		s.AddCleanup(func(_ *gc.C) { s.st.Close() })
    27  	} else {
    28  		s.st = s.State
    29  		s.series = "quantal"
    30  	}
    31  	var err error
    32  	s.deviceBackend, err = state.NewDeviceBackend(s.st)
    33  	c.Assert(err, jc.ErrorIsNil)
    34  }
    35  
    36  func (s *DevicesStateSuiteBase) AddTestingCharm(c *gc.C, name string) *state.Charm {
    37  	return state.AddTestingCharmForSeries(c, s.st, s.series, name)
    38  }
    39  
    40  func makeDeviceCons(t state.DeviceType, count int64) state.DeviceConstraints {
    41  	return state.DeviceConstraints{Type: t, Count: count}
    42  }
    43  
    44  type CAASDevicesStateSuite struct {
    45  	DevicesStateSuiteBase
    46  }
    47  
    48  func (s *CAASDevicesStateSuite) SetUpTest(c *gc.C) {
    49  	s.series = "kubernetes"
    50  	s.DevicesStateSuiteBase.SetUpTest(c)
    51  }
    52  
    53  var _ = gc.Suite(&CAASDevicesStateSuite{})
    54  
    55  func (s *CAASDevicesStateSuite) TestAddApplicationDevicesConstraintsValidation(c *gc.C) {
    56  	ch := s.AddTestingCharm(c, "bitcoin-miner")
    57  	addApplication := func(devices map[string]state.DeviceConstraints) (*state.Application, error) {
    58  		return s.st.AddApplication(state.AddApplicationArgs{Name: "bitcoin-miner", Charm: ch,
    59  			Devices: devices,
    60  			CharmOrigin: &state.CharmOrigin{Platform: &state.Platform{
    61  				OS:      "ubuntu",
    62  				Channel: "20.04/stable",
    63  			}},
    64  		})
    65  	}
    66  	assertErr := func(devices map[string]state.DeviceConstraints, expect string) {
    67  		_, err := addApplication(devices)
    68  		c.Assert(err, gc.ErrorMatches, expect)
    69  	}
    70  
    71  	deviceCons := map[string]state.DeviceConstraints{
    72  		"bitcoinminer-incorrect-name": makeDeviceCons("nvidia.com/gpu", 2),
    73  	}
    74  	assertErr(deviceCons, `cannot add application "bitcoin-miner": charm "bitcoin-miner" has no device called "bitcoinminer-incorrect-name"`)
    75  	deviceCons = map[string]state.DeviceConstraints{
    76  		"bitcoinminer": makeDeviceCons("nvidia.com/gpu", 0),
    77  	}
    78  	assertErr(deviceCons, `cannot add application "bitcoin-miner": charm "bitcoin-miner" device "bitcoinminer": minimum device size is 1, 0 specified`)
    79  	deviceCons["bitcoinminer"] = makeDeviceCons("nvidia.com/gpu", 2)
    80  	app, err := addApplication(deviceCons)
    81  	c.Assert(err, jc.ErrorIsNil)
    82  
    83  	var devs map[string]state.DeviceConstraints
    84  	devs, err = app.DeviceConstraints()
    85  	c.Assert(err, jc.ErrorIsNil)
    86  	c.Assert(devs, jc.DeepEquals, map[string]state.DeviceConstraints{
    87  		"bitcoinminer": {
    88  			Type:       "nvidia.com/gpu",
    89  			Count:      2,
    90  			Attributes: map[string]string{},
    91  		},
    92  	})
    93  }