~juju-qa/ubuntu/xenial/juju/2.0-rc2

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/apiserver/controller/controller.go

  • Committer: Nicholas Skaggs
  • Date: 2016-09-30 14:39:30 UTC
  • mfrom: (1.8.1)
  • Revision ID: nicholas.skaggs@canonical.com-20160930143930-vwwhrefh6ftckccy
import upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
        "github.com/juju/juju/apiserver/common/cloudspec"
23
23
        "github.com/juju/juju/apiserver/facade"
24
24
        "github.com/juju/juju/apiserver/params"
25
 
        "github.com/juju/juju/core/description"
26
25
        coremigration "github.com/juju/juju/core/migration"
27
26
        "github.com/juju/juju/migration"
 
27
        "github.com/juju/juju/permission"
28
28
        "github.com/juju/juju/state"
29
29
        "github.com/juju/juju/state/stateenvirons"
30
30
)
40
40
        AllModels() (params.UserModelList, error)
41
41
        DestroyController(args params.DestroyControllerArgs) error
42
42
        ModelConfig() (params.ModelConfigResults, error)
 
43
        HostedModelConfigs() (params.HostedModelConfigsResults, error)
43
44
        GetControllerAccess(params.Entities) (params.UserAccessResults, error)
44
45
        ControllerConfig() (params.ControllerConfigResult, error)
45
46
        ListBlockedModels() (params.ModelBlockInfoList, error)
91
92
}
92
93
 
93
94
func (s *ControllerAPI) checkHasAdmin() error {
94
 
        isAdmin, err := s.authorizer.HasPermission(description.SuperuserAccess, s.state.ControllerTag())
 
95
        isAdmin, err := s.authorizer.HasPermission(permission.SuperuserAccess, s.state.ControllerTag())
95
96
        if err != nil {
96
97
                return errors.Trace(err)
97
98
        }
233
234
        return result, nil
234
235
}
235
236
 
 
237
// HostedModelConfigs returns all the information that the client needs in
 
238
// order to connect directly with the host model's provider and destroy it
 
239
// directly.
 
240
func (s *ControllerAPI) HostedModelConfigs() (params.HostedModelConfigsResults, error) {
 
241
        result := params.HostedModelConfigsResults{}
 
242
        if err := s.checkHasAdmin(); err != nil {
 
243
                return result, errors.Trace(err)
 
244
        }
 
245
 
 
246
        controllerModel, err := s.state.ControllerModel()
 
247
        if err != nil {
 
248
                return result, errors.Trace(err)
 
249
        }
 
250
 
 
251
        allModels, err := s.state.AllModels()
 
252
        if err != nil {
 
253
                return result, errors.Trace(err)
 
254
        }
 
255
 
 
256
        for _, model := range allModels {
 
257
                if model.UUID() != controllerModel.UUID() {
 
258
                        config := params.HostedModelConfig{
 
259
                                Name:     model.Name(),
 
260
                                OwnerTag: model.Owner().String(),
 
261
                        }
 
262
                        modelConf, err := model.Config()
 
263
                        if err != nil {
 
264
                                config.Error = common.ServerError(err)
 
265
                        } else {
 
266
                                config.Config = modelConf.AllAttrs()
 
267
                        }
 
268
                        cloudSpec := s.GetCloudSpec(model.ModelTag())
 
269
                        if config.Error == nil {
 
270
                                config.CloudSpec = cloudSpec.Result
 
271
                                config.Error = cloudSpec.Error
 
272
                        }
 
273
                        result.Models = append(result.Models, config)
 
274
                }
 
275
        }
 
276
 
 
277
        return result, nil
 
278
}
 
279
 
236
280
// RemoveBlocks removes all the blocks in the controller.
237
281
func (s *ControllerAPI) RemoveBlocks(args params.RemoveBlocksArgs) error {
238
282
        if err := s.checkHasAdmin(); err != nil {
309
353
// have on the controller.
310
354
func (c *ControllerAPI) GetControllerAccess(req params.Entities) (params.UserAccessResults, error) {
311
355
        results := params.UserAccessResults{}
312
 
        isAdmin, err := c.authorizer.HasPermission(description.SuperuserAccess, c.state.ControllerTag())
 
356
        isAdmin, err := c.authorizer.HasPermission(permission.SuperuserAccess, c.state.ControllerTag())
313
357
        if err != nil {
314
358
                return results, errors.Trace(err)
315
359
        }
382
426
 
383
427
        // Construct target info.
384
428
        specTarget := spec.TargetInfo
385
 
        controllerTag, err := names.ParseModelTag(specTarget.ControllerTag)
 
429
        controllerTag, err := names.ParseControllerTag(specTarget.ControllerTag)
386
430
        if err != nil {
387
431
                return "", errors.Annotate(err, "controller tag")
388
432
        }
406
450
        }
407
451
 
408
452
        // Check if the migration is likely to succeed.
409
 
        if err := runMigrationPrechecks(hostedState, targetInfo); err != nil {
410
 
                return "", errors.Trace(err)
 
453
        if !(spec.ExternalControl && spec.SkipInitialPrechecks) {
 
454
                if err := runMigrationPrechecks(hostedState, targetInfo); err != nil {
 
455
                        return "", errors.Trace(err)
 
456
                }
411
457
        }
412
458
 
413
459
        // Trigger the migration.
483
529
                return result, nil
484
530
        }
485
531
 
486
 
        hasPermission, err := c.authorizer.HasPermission(description.SuperuserAccess, c.state.ControllerTag())
 
532
        hasPermission, err := c.authorizer.HasPermission(permission.SuperuserAccess, c.state.ControllerTag())
487
533
        if err != nil {
488
534
                return result, errors.Trace(err)
489
535
        }
494
540
                        continue
495
541
                }
496
542
 
497
 
                controllerAccess := description.Access(arg.Access)
498
 
                if err := description.ValidateControllerAccess(controllerAccess); err != nil {
 
543
                controllerAccess := permission.Access(arg.Access)
 
544
                if err := permission.ValidateControllerAccess(controllerAccess); err != nil {
499
545
                        result.Results[i].Error = common.ServerError(err)
500
546
                        continue
501
547
                }
519
565
        }
520
566
 
521
567
        // Check target controller.
522
 
        conn, err := api.Open(targetToAPIInfo(targetInfo), api.DialOpts{})
 
568
        conn, err := api.Open(targetToAPIInfo(targetInfo), migration.ControllerDialOpts())
523
569
        if err != nil {
524
570
                return errors.Annotate(err, "connect to target controller")
525
571
        }
562
608
        }
563
609
}
564
610
 
565
 
func grantControllerAccess(accessor *state.State, targetUserTag, apiUser names.UserTag, access description.Access) error {
 
611
func grantControllerAccess(accessor *state.State, targetUserTag, apiUser names.UserTag, access permission.Access) error {
566
612
        _, err := accessor.AddControllerUser(state.UserAccessSpec{User: targetUserTag, CreatedBy: apiUser, Access: access})
567
613
        if errors.IsAlreadyExists(err) {
568
614
                controllerTag := accessor.ControllerTag()
591
637
        return nil
592
638
}
593
639
 
594
 
func revokeControllerAccess(accessor *state.State, targetUserTag, apiUser names.UserTag, access description.Access) error {
 
640
func revokeControllerAccess(accessor *state.State, targetUserTag, apiUser names.UserTag, access permission.Access) error {
595
641
        controllerTag := accessor.ControllerTag()
596
642
        switch access {
597
 
        case description.LoginAccess:
 
643
        case permission.LoginAccess:
598
644
                // Revoking login access removes all access.
599
645
                err := accessor.RemoveUserAccess(targetUserTag, controllerTag)
600
646
                return errors.Annotate(err, "could not revoke controller access")
601
 
        case description.AddModelAccess:
 
647
        case permission.AddModelAccess:
602
648
                // Revoking add-model access sets login.
603
649
                controllerUser, err := accessor.UserAccess(targetUserTag, controllerTag)
604
650
                if err != nil {
605
651
                        return errors.Annotate(err, "could not look up controller access for user")
606
652
                }
607
 
                _, err = accessor.SetUserAccess(controllerUser.UserTag, controllerUser.Object, description.LoginAccess)
 
653
                _, err = accessor.SetUserAccess(controllerUser.UserTag, controllerUser.Object, permission.LoginAccess)
608
654
                return errors.Annotate(err, "could not set controller access to read-only")
609
 
        case description.SuperuserAccess:
 
655
        case permission.SuperuserAccess:
610
656
                // Revoking superuser sets add-model.
611
657
                controllerUser, err := accessor.UserAccess(targetUserTag, controllerTag)
612
658
                if err != nil {
613
659
                        return errors.Annotate(err, "could not look up controller access for user")
614
660
                }
615
 
                _, err = accessor.SetUserAccess(controllerUser.UserTag, controllerUser.Object, description.AddModelAccess)
 
661
                _, err = accessor.SetUserAccess(controllerUser.UserTag, controllerUser.Object, permission.AddModelAccess)
616
662
                return errors.Annotate(err, "could not set controller access to add-model")
617
663
 
618
664
        default:
623
669
 
624
670
// ChangeControllerAccess performs the requested access grant or revoke action for the
625
671
// specified user on the controller.
626
 
func ChangeControllerAccess(accessor *state.State, apiUser, targetUserTag names.UserTag, action params.ControllerAction, access description.Access) error {
 
672
func ChangeControllerAccess(accessor *state.State, apiUser, targetUserTag names.UserTag, action params.ControllerAction, access permission.Access) error {
627
673
        switch action {
628
674
        case params.GrantControllerAccess:
629
675
                err := grantControllerAccess(accessor, targetUserTag, apiUser, access)