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 }