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

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package apiserver
     5  
     6  import (
     7  	"reflect"
     8  
     9  	"github.com/juju/juju/apiserver/facade"
    10  	"github.com/juju/juju/apiserver/facades/agent/agent"
    11  	"github.com/juju/juju/apiserver/facades/agent/caasadmission"
    12  	"github.com/juju/juju/apiserver/facades/agent/caasagent"
    13  	"github.com/juju/juju/apiserver/facades/agent/caasapplication"
    14  	"github.com/juju/juju/apiserver/facades/agent/caasoperator"
    15  	"github.com/juju/juju/apiserver/facades/agent/credentialvalidator"
    16  	"github.com/juju/juju/apiserver/facades/agent/deployer"
    17  	"github.com/juju/juju/apiserver/facades/agent/diskmanager"
    18  	"github.com/juju/juju/apiserver/facades/agent/fanconfigurer"
    19  	"github.com/juju/juju/apiserver/facades/agent/hostkeyreporter"
    20  	"github.com/juju/juju/apiserver/facades/agent/instancemutater"
    21  	"github.com/juju/juju/apiserver/facades/agent/keyupdater"
    22  	"github.com/juju/juju/apiserver/facades/agent/leadership"
    23  	agentlifeflag "github.com/juju/juju/apiserver/facades/agent/lifeflag"
    24  	loggerapi "github.com/juju/juju/apiserver/facades/agent/logger"
    25  	"github.com/juju/juju/apiserver/facades/agent/machine"
    26  	"github.com/juju/juju/apiserver/facades/agent/machineactions"
    27  	"github.com/juju/juju/apiserver/facades/agent/meterstatus"
    28  	"github.com/juju/juju/apiserver/facades/agent/metricsadder"
    29  	"github.com/juju/juju/apiserver/facades/agent/migrationflag"
    30  	"github.com/juju/juju/apiserver/facades/agent/migrationminion"
    31  	"github.com/juju/juju/apiserver/facades/agent/payloadshookcontext"
    32  	"github.com/juju/juju/apiserver/facades/agent/provisioner"
    33  	"github.com/juju/juju/apiserver/facades/agent/proxyupdater"
    34  	"github.com/juju/juju/apiserver/facades/agent/reboot"
    35  	"github.com/juju/juju/apiserver/facades/agent/resourceshookcontext"
    36  	"github.com/juju/juju/apiserver/facades/agent/retrystrategy"
    37  	"github.com/juju/juju/apiserver/facades/agent/secretsdrain"
    38  	"github.com/juju/juju/apiserver/facades/agent/secretsmanager"
    39  	"github.com/juju/juju/apiserver/facades/agent/storageprovisioner"
    40  	"github.com/juju/juju/apiserver/facades/agent/unitassigner"
    41  	"github.com/juju/juju/apiserver/facades/agent/uniter"
    42  	"github.com/juju/juju/apiserver/facades/agent/upgrader"
    43  	"github.com/juju/juju/apiserver/facades/agent/upgradeseries"
    44  	"github.com/juju/juju/apiserver/facades/agent/upgradesteps"
    45  	"github.com/juju/juju/apiserver/facades/client/action"
    46  	"github.com/juju/juju/apiserver/facades/client/annotations" // ModelUser Write
    47  	"github.com/juju/juju/apiserver/facades/client/application"
    48  	"github.com/juju/juju/apiserver/facades/client/applicationoffers" // ModelUser Write
    49  	"github.com/juju/juju/apiserver/facades/client/backups"           // ModelUser Write
    50  	"github.com/juju/juju/apiserver/facades/client/block"             // ModelUser Write
    51  	"github.com/juju/juju/apiserver/facades/client/bundle"
    52  	"github.com/juju/juju/apiserver/facades/client/charms"     // ModelUser Write
    53  	"github.com/juju/juju/apiserver/facades/client/client"     // ModelUser Write
    54  	"github.com/juju/juju/apiserver/facades/client/cloud"      // ModelUser Read
    55  	"github.com/juju/juju/apiserver/facades/client/controller" // ModelUser Admin (although some methods check for read only)
    56  	"github.com/juju/juju/apiserver/facades/client/credentialmanager"
    57  	"github.com/juju/juju/apiserver/facades/client/highavailability" // ModelUser Write
    58  	"github.com/juju/juju/apiserver/facades/client/imagemetadatamanager"
    59  	"github.com/juju/juju/apiserver/facades/client/keymanager"     // ModelUser Write
    60  	"github.com/juju/juju/apiserver/facades/client/machinemanager" // ModelUser Write
    61  	"github.com/juju/juju/apiserver/facades/client/metricsdebug"   // ModelUser Write
    62  	"github.com/juju/juju/apiserver/facades/client/modelconfig"    // ModelUser Write
    63  	"github.com/juju/juju/apiserver/facades/client/modelgeneration"
    64  	"github.com/juju/juju/apiserver/facades/client/modelmanager" // ModelUser Write
    65  	"github.com/juju/juju/apiserver/facades/client/modelupgrader"
    66  	"github.com/juju/juju/apiserver/facades/client/payloads"
    67  	"github.com/juju/juju/apiserver/facades/client/resources"
    68  	"github.com/juju/juju/apiserver/facades/client/secretbackends"
    69  	"github.com/juju/juju/apiserver/facades/client/secrets"
    70  	"github.com/juju/juju/apiserver/facades/client/spaces"    // ModelUser Write
    71  	"github.com/juju/juju/apiserver/facades/client/sshclient" // ModelUser Write
    72  	"github.com/juju/juju/apiserver/facades/client/storage"
    73  	"github.com/juju/juju/apiserver/facades/client/subnets"
    74  	"github.com/juju/juju/apiserver/facades/client/usermanager"
    75  	"github.com/juju/juju/apiserver/facades/controller/actionpruner"
    76  	"github.com/juju/juju/apiserver/facades/controller/agenttools"
    77  	"github.com/juju/juju/apiserver/facades/controller/applicationscaler"
    78  	"github.com/juju/juju/apiserver/facades/controller/caasapplicationprovisioner"
    79  	"github.com/juju/juju/apiserver/facades/controller/caasfirewaller"
    80  	"github.com/juju/juju/apiserver/facades/controller/caasmodelconfigmanager"
    81  	"github.com/juju/juju/apiserver/facades/controller/caasmodeloperator"
    82  	"github.com/juju/juju/apiserver/facades/controller/caasoperatorprovisioner"
    83  	"github.com/juju/juju/apiserver/facades/controller/caasoperatorupgrader"
    84  	"github.com/juju/juju/apiserver/facades/controller/caasunitprovisioner"
    85  	"github.com/juju/juju/apiserver/facades/controller/charmdownloader"
    86  	"github.com/juju/juju/apiserver/facades/controller/charmrevisionupdater"
    87  	"github.com/juju/juju/apiserver/facades/controller/cleaner"
    88  	"github.com/juju/juju/apiserver/facades/controller/crosscontroller"
    89  	"github.com/juju/juju/apiserver/facades/controller/crossmodelrelations"
    90  	"github.com/juju/juju/apiserver/facades/controller/crossmodelsecrets"
    91  	"github.com/juju/juju/apiserver/facades/controller/environupgrader"
    92  	"github.com/juju/juju/apiserver/facades/controller/externalcontrollerupdater"
    93  	"github.com/juju/juju/apiserver/facades/controller/firewaller"
    94  	"github.com/juju/juju/apiserver/facades/controller/imagemetadata"
    95  	"github.com/juju/juju/apiserver/facades/controller/instancepoller"
    96  	"github.com/juju/juju/apiserver/facades/controller/lifeflag"
    97  	"github.com/juju/juju/apiserver/facades/controller/logfwd"
    98  	"github.com/juju/juju/apiserver/facades/controller/machineundertaker"
    99  	"github.com/juju/juju/apiserver/facades/controller/metricsmanager"
   100  	"github.com/juju/juju/apiserver/facades/controller/migrationmaster"
   101  	"github.com/juju/juju/apiserver/facades/controller/migrationtarget"
   102  	"github.com/juju/juju/apiserver/facades/controller/remoterelations"
   103  	"github.com/juju/juju/apiserver/facades/controller/secretbackendmanager"
   104  	"github.com/juju/juju/apiserver/facades/controller/singular"
   105  	"github.com/juju/juju/apiserver/facades/controller/statushistory"
   106  	"github.com/juju/juju/apiserver/facades/controller/undertaker"
   107  	"github.com/juju/juju/apiserver/facades/controller/usersecrets"
   108  	"github.com/juju/juju/apiserver/facades/controller/usersecretsdrain"
   109  	"github.com/juju/juju/core/facades"
   110  )
   111  
   112  // requiredMigrationFacadeVersions returns the facade versions that
   113  // must be available for the migration master to function.
   114  // This is a separate function so that it can be used in the
   115  // migrationmaster facade registration as a dependency.
   116  //
   117  // A lot of the agent facades aren't actually required, but they are
   118  // included here to keep the agent alive during migration.
   119  func requiredMigrationFacadeVersions() facades.FacadeVersions {
   120  	registry := new(facade.Registry)
   121  
   122  	// Client and modelmanager facades are required for the migration
   123  	// master to function correctly. Missing a model manager causes the
   124  	// status to error out.
   125  	client.Register(registry)
   126  	modelmanager.Register(registry)
   127  
   128  	// The following are required to keep the agent alive during
   129  	// migration.
   130  	// This list is extremely conservative, and should be trimmed down
   131  	// once we have a better idea of what is actually required.
   132  	agent.Register(registry)
   133  	caasadmission.Register(registry)
   134  	caasagent.Register(registry)
   135  	caasapplication.Register(registry)
   136  	caasoperator.Register(registry)
   137  	credentialvalidator.Register(registry)
   138  	deployer.Register(registry)
   139  	diskmanager.Register(registry)
   140  	fanconfigurer.Register(registry)
   141  	hostkeyreporter.Register(registry)
   142  	instancemutater.Register(registry)
   143  	keyupdater.Register(registry)
   144  	leadership.Register(registry)
   145  	agentlifeflag.Register(registry)
   146  	loggerapi.Register(registry)
   147  	machine.Register(registry)
   148  	machineactions.Register(registry)
   149  	meterstatus.Register(registry)
   150  	metricsadder.Register(registry)
   151  	migrationflag.Register(registry)
   152  	migrationminion.Register(registry)
   153  	payloadshookcontext.Register(registry)
   154  	provisioner.Register(registry)
   155  	proxyupdater.Register(registry)
   156  	reboot.Register(registry)
   157  	resourceshookcontext.Register(registry)
   158  	retrystrategy.Register(registry)
   159  	secretsdrain.Register(registry)
   160  	secretsmanager.Register(registry)
   161  	storageprovisioner.Register(registry)
   162  	unitassigner.Register(registry)
   163  	uniter.Register(registry)
   164  	upgrader.Register(registry)
   165  	upgradeseries.Register(registry)
   166  	upgradesteps.Register(registry)
   167  
   168  	registerWatchers(registry)
   169  
   170  	list := registry.List()
   171  	versions := make(facades.FacadeVersions, len(list))
   172  	for _, details := range list {
   173  		versions[details.Name] = details.Versions
   174  	}
   175  	return versions
   176  }
   177  
   178  // AllFacades returns a registry containing all known API facades.
   179  //
   180  // This will panic if facade registration fails, but there is a unit
   181  // test to guard against that.
   182  func AllFacades() *facade.Registry {
   183  	registry := new(facade.Registry)
   184  
   185  	action.Register(registry)
   186  	actionpruner.Register(registry)
   187  	agent.Register(registry)
   188  	agenttools.Register(registry)
   189  	annotations.Register(registry)
   190  	application.Register(registry)
   191  	applicationoffers.Register(registry)
   192  	applicationscaler.Register(registry)
   193  	backups.Register(registry)
   194  	block.Register(registry)
   195  	bundle.Register(registry)
   196  	charmdownloader.Register(registry)
   197  	charmrevisionupdater.Register(registry)
   198  	charms.Register(registry)
   199  	cleaner.Register(registry)
   200  	client.Register(registry)
   201  	cloud.Register(registry)
   202  	agentlifeflag.Register(registry)
   203  
   204  	// CAAS related facades.
   205  	caasadmission.Register(registry)
   206  	caasagent.Register(registry)
   207  	caasapplication.Register(registry)
   208  	caasapplicationprovisioner.Register(registry)
   209  	caasfirewaller.Register(registry)
   210  	caasoperator.Register(registry)
   211  	caasmodeloperator.Register(registry)
   212  	caasmodelconfigmanager.Register(registry)
   213  	caasoperatorprovisioner.Register(registry)
   214  	caasoperatorupgrader.Register(registry)
   215  	caasunitprovisioner.Register(registry)
   216  
   217  	controller.Register(registry)
   218  	crossmodelrelations.Register(registry)
   219  	crossmodelsecrets.Register(registry)
   220  	crosscontroller.Register(registry)
   221  	credentialmanager.Register(registry)
   222  	credentialvalidator.Register(registry)
   223  	externalcontrollerupdater.Register(registry)
   224  	deployer.Register(registry)
   225  	diskmanager.Register(registry)
   226  	environupgrader.Register(registry)
   227  	fanconfigurer.Register(registry)
   228  	firewaller.Register(registry)
   229  	highavailability.Register(registry)
   230  	hostkeyreporter.Register(registry)
   231  	imagemetadata.Register(registry)
   232  	imagemetadatamanager.Register(registry)
   233  	instancemutater.Register(registry)
   234  	instancepoller.Register(registry)
   235  	keymanager.Register(registry)
   236  	keyupdater.Register(registry)
   237  	leadership.Register(registry)
   238  	lifeflag.Register(registry)
   239  	loggerapi.Register(registry)
   240  	logfwd.Register(registry)
   241  	machineactions.Register(registry)
   242  	machinemanager.Register(registry)
   243  	machineundertaker.Register(registry)
   244  	machine.Register(registry)
   245  	meterstatus.Register(registry)
   246  	metricsadder.Register(registry)
   247  	metricsdebug.Register(registry)
   248  	metricsmanager.Register(registry)
   249  	migrationflag.Register(registry)
   250  	migrationmaster.Register(registry)
   251  	migrationminion.Register(registry)
   252  	migrationtarget.Register(requiredMigrationFacadeVersions())(registry)
   253  	modelconfig.Register(registry)
   254  	modelgeneration.Register(registry)
   255  	modelmanager.Register(registry)
   256  	modelupgrader.Register(registry)
   257  	payloads.Register(registry)
   258  	payloadshookcontext.Register(registry)
   259  	provisioner.Register(registry)
   260  	proxyupdater.Register(registry)
   261  	reboot.Register(registry)
   262  	remoterelations.Register(registry)
   263  	resources.Register(registry)
   264  	resourceshookcontext.Register(registry)
   265  	retrystrategy.Register(registry)
   266  	singular.Register(registry)
   267  	secrets.Register(registry)
   268  	secretbackends.Register(registry)
   269  	secretbackendmanager.Register(registry)
   270  	secretsmanager.Register(registry)
   271  	secretsdrain.Register(registry)
   272  	usersecrets.Register(registry)
   273  	usersecretsdrain.Register(registry)
   274  	sshclient.Register(registry)
   275  	spaces.Register(registry)
   276  	statushistory.Register(registry)
   277  	storage.Register(registry)
   278  	storageprovisioner.Register(registry)
   279  	subnets.Register(registry)
   280  	undertaker.Register(registry)
   281  	unitassigner.Register(registry)
   282  	uniter.Register(registry)
   283  	upgrader.Register(registry)
   284  	upgradeseries.Register(registry)
   285  	upgradesteps.Register(registry)
   286  	usermanager.Register(registry)
   287  
   288  	registerWatchers(registry)
   289  
   290  	return registry
   291  }
   292  
   293  // adminAPIFactories holds methods used to create
   294  // admin APIs with specific versions.
   295  var adminAPIFactories = map[int]adminAPIFactory{
   296  	3: newAdminAPIV3,
   297  }
   298  
   299  // AdminFacadeDetails returns information on the Admin facade provided
   300  // at login time. The Facade field of the returned slice elements will
   301  // be nil.
   302  func AdminFacadeDetails() []facade.Details {
   303  	var fs []facade.Details
   304  	for v, f := range adminAPIFactories {
   305  		api := f(nil, nil, nil)
   306  		t := reflect.TypeOf(api)
   307  		fs = append(fs, facade.Details{
   308  			Name:    "Admin",
   309  			Version: v,
   310  			Type:    t,
   311  		})
   312  	}
   313  	return fs
   314  }
   315  
   316  func registerWatchers(registry *facade.Registry) {
   317  	// TODO (stickupkid): The following should be moved into a package.
   318  	registry.MustRegister("Pinger", 1, func(ctx facade.Context) (facade.Facade, error) {
   319  		return NewPinger(ctx)
   320  	}, reflect.TypeOf((*Pinger)(nil)).Elem())
   321  
   322  	registry.MustRegister("AllWatcher", 3, NewAllWatcher, reflect.TypeOf((*SrvAllWatcher)(nil)))
   323  	// Note: AllModelWatcher uses the same infrastructure as AllWatcher
   324  	// but they are get under separate names as it possible the may
   325  	// diverge in the future (especially in terms of authorisation
   326  	// checks).
   327  	registry.MustRegister("AllModelWatcher", 4, NewAllWatcher, reflect.TypeOf((*SrvAllWatcher)(nil)))
   328  	registry.MustRegister("NotifyWatcher", 1, newNotifyWatcher, reflect.TypeOf((*srvNotifyWatcher)(nil)))
   329  	registry.MustRegister("StringsWatcher", 1, newStringsWatcher, reflect.TypeOf((*srvStringsWatcher)(nil)))
   330  	registry.MustRegister("OfferStatusWatcher", 1, newOfferStatusWatcher, reflect.TypeOf((*srvOfferStatusWatcher)(nil)))
   331  	registry.MustRegister("RelationStatusWatcher", 1, newRelationStatusWatcher, reflect.TypeOf((*srvRelationStatusWatcher)(nil)))
   332  	registry.MustRegister("RelationUnitsWatcher", 1, newRelationUnitsWatcher, reflect.TypeOf((*srvRelationUnitsWatcher)(nil)))
   333  	registry.MustRegister("RemoteRelationWatcher", 1, newRemoteRelationWatcher, reflect.TypeOf((*srvRemoteRelationWatcher)(nil)))
   334  	registry.MustRegister("VolumeAttachmentsWatcher", 2, newVolumeAttachmentsWatcher, reflect.TypeOf((*srvMachineStorageIdsWatcher)(nil)))
   335  	registry.MustRegister("VolumeAttachmentPlansWatcher", 1, newVolumeAttachmentPlansWatcher, reflect.TypeOf((*srvMachineStorageIdsWatcher)(nil)))
   336  	registry.MustRegister("FilesystemAttachmentsWatcher", 2, newFilesystemAttachmentsWatcher, reflect.TypeOf((*srvMachineStorageIdsWatcher)(nil)))
   337  	registry.MustRegister("EntityWatcher", 2, newEntitiesWatcher, reflect.TypeOf((*srvEntitiesWatcher)(nil)))
   338  	registry.MustRegister("MigrationStatusWatcher", 1, newMigrationStatusWatcher, reflect.TypeOf((*srvMigrationStatusWatcher)(nil)))
   339  	registry.MustRegister("ModelSummaryWatcher", 1, newModelSummaryWatcher, reflect.TypeOf((*SrvModelSummaryWatcher)(nil)))
   340  	registry.MustRegister("SecretsTriggerWatcher", 1, newSecretsTriggerWatcher, reflect.TypeOf((*srvSecretTriggerWatcher)(nil)))
   341  	registry.MustRegister("SecretBackendsRotateWatcher", 1, newSecretBackendsRotateWatcher, reflect.TypeOf((*srvSecretBackendsRotateWatcher)(nil)))
   342  	registry.MustRegister("SecretsRevisionWatcher", 1, newSecretsRevisionWatcher, reflect.TypeOf((*srvSecretsRevisionWatcher)(nil)))
   343  }