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 }