func (s *deviceMgrSuite) TestFullDeviceRegistrationHappyPrepareDeviceHook(c *C) { r1 := devicestate.MockKeyLength(752) defer r1() mockServer := s.mockServer(c, "REQID-1") defer mockServer.Close() r2 := hookstate.MockRunHook(func(ctx *hookstate.Context, _ *tomb.Tomb) ([]byte, error) { c.Assert(ctx.HookName(), Equals, "prepare-device") // snapctl set the registration params _, _, err := ctlcmd.Run(ctx, []string{"set", fmt.Sprintf("device-service.url=%q", mockServer.URL+"/identity/api/v1/")}) c.Assert(err, IsNil) h, err := json.Marshal(map[string]string{ "x-extra-header": "extra", }) c.Assert(err, IsNil) _, _, err = ctlcmd.Run(ctx, []string{"set", fmt.Sprintf("device-service.headers=%s", string(h))}) c.Assert(err, IsNil) _, _, err = ctlcmd.Run(ctx, []string{"set", fmt.Sprintf("registration.proposed-serial=%q", "Y9999")}) c.Assert(err, IsNil) d, err := yaml.Marshal(map[string]string{ "mac": "00:00:00:00:ff:00", }) c.Assert(err, IsNil) _, _, err = ctlcmd.Run(ctx, []string{"set", fmt.Sprintf("registration.body=%q", d)}) c.Assert(err, IsNil) return nil, nil }) defer r2() // setup state as will be done by first-boot // & have a gadget with a prepare-device hook s.state.Lock() defer s.state.Unlock() s.setupGadget(c, ` name: gadget type: gadget version: gadget hooks: prepare-device: `, "") auth.SetDevice(s.state, &auth.DeviceState{ Brand: "canonical", Model: "pc", }) // runs the whole device registration process s.state.Unlock() s.settle() s.state.Lock() var becomeOperational *state.Change for _, chg := range s.state.Changes() { if chg.Kind() == "become-operational" { becomeOperational = chg break } } c.Assert(becomeOperational, NotNil) c.Check(becomeOperational.Status().Ready(), Equals, true) c.Check(becomeOperational.Err(), IsNil) device, err := auth.Device(s.state) c.Assert(err, IsNil) c.Check(device.Brand, Equals, "canonical") c.Check(device.Model, Equals, "pc") c.Check(device.Serial, Equals, "Y9999") a, err := s.db.Find(asserts.SerialType, map[string]string{ "brand-id": "canonical", "model": "pc", "serial": "Y9999", }) c.Assert(err, IsNil) serial := a.(*asserts.Serial) var details map[string]interface{} err = yaml.Unmarshal(serial.Body(), &details) c.Assert(err, IsNil) c.Check(details, DeepEquals, map[string]interface{}{ "mac": "00:00:00:00:ff:00", }) privKey, err := s.mgr.KeypairManager().Get(serial.DeviceKey().ID()) c.Assert(err, IsNil) c.Check(privKey, NotNil) c.Check(device.KeyID, Equals, privKey.PublicKey().ID()) }
func (s *deviceMgrSuite) TestFullDeviceRegistrationPollHappy(c *C) { r1 := devicestate.MockKeyLength(752) defer r1() mockServer := s.mockServer(c, "REQID-POLL") defer mockServer.Close() mockRequestIDURL := mockServer.URL + "/identity/api/v1/request-id" r2 := devicestate.MockRequestIDURL(mockRequestIDURL) defer r2() mockSerialRequestURL := mockServer.URL + "/identity/api/v1/devices" r3 := devicestate.MockSerialRequestURL(mockSerialRequestURL) defer r3() // immediately r4 := devicestate.MockRetryInterval(0) defer r4() // setup state as will be done by first-boot s.state.Lock() defer s.state.Unlock() s.setupGadget(c, ` name: gadget type: gadget version: gadget `, "") auth.SetDevice(s.state, &auth.DeviceState{ Brand: "canonical", Model: "pc", }) // runs the whole device registration process with polling s.state.Unlock() s.settle() s.state.Lock() var becomeOperational *state.Change for _, chg := range s.state.Changes() { if chg.Kind() == "become-operational" { becomeOperational = chg break } } c.Assert(becomeOperational, NotNil) c.Check(becomeOperational.Status().Ready(), Equals, true) c.Check(becomeOperational.Err(), IsNil) device, err := auth.Device(s.state) c.Assert(err, IsNil) c.Check(device.Brand, Equals, "canonical") c.Check(device.Model, Equals, "pc") c.Check(device.Serial, Equals, "10002") a, err := s.db.Find(asserts.SerialType, map[string]string{ "brand-id": "canonical", "model": "pc", "serial": "10002", }) c.Assert(err, IsNil) serial := a.(*asserts.Serial) privKey, err := s.mgr.KeypairManager().Get(serial.DeviceKey().ID()) c.Assert(err, IsNil) c.Check(privKey, NotNil) c.Check(device.KeyID, Equals, privKey.PublicKey().ID()) }