calagoapi 1.0.dev1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. calagoapi/__init__.py +190 -0
  2. calagoapi/account/__init__.py +14 -0
  3. calagoapi/account/account.py +292 -0
  4. calagoapi/account/auth.py +72 -0
  5. calagoapi/account/models.py +221 -0
  6. calagoapi/admin/__init__.py +48 -0
  7. calagoapi/admin/admin.py +341 -0
  8. calagoapi/admin/managers.py +490 -0
  9. calagoapi/admin/resources.py +970 -0
  10. calagoapi/aio/__init__.py +9 -0
  11. calagoapi/aio/console.py +289 -0
  12. calagoapi/aio/panel.py +176 -0
  13. calagoapi/api/__init__.py +63 -0
  14. calagoapi/api/account.py +195 -0
  15. calagoapi/api/admin.py +402 -0
  16. calagoapi/api/attachments.py +27 -0
  17. calagoapi/api/auth.py +52 -0
  18. calagoapi/api/backups.py +99 -0
  19. calagoapi/api/client.py +198 -0
  20. calagoapi/api/databases.py +217 -0
  21. calagoapi/api/files.py +210 -0
  22. calagoapi/api/network.py +84 -0
  23. calagoapi/api/public.py +13 -0
  24. calagoapi/api/schedules.py +79 -0
  25. calagoapi/api/servers.py +114 -0
  26. calagoapi/api/users.py +27 -0
  27. calagoapi/api/versions.py +29 -0
  28. calagoapi/backups/__init__.py +8 -0
  29. calagoapi/backups/backup.py +292 -0
  30. calagoapi/backups/manager.py +177 -0
  31. calagoapi/console/__init__.py +6 -0
  32. calagoapi/console/console.py +392 -0
  33. calagoapi/databases/__init__.py +12 -0
  34. calagoapi/databases/database.py +445 -0
  35. calagoapi/databases/explorer.py +159 -0
  36. calagoapi/databases/manager.py +122 -0
  37. calagoapi/files/__init__.py +9 -0
  38. calagoapi/files/file.py +196 -0
  39. calagoapi/files/manager.py +437 -0
  40. calagoapi/network/__init__.py +8 -0
  41. calagoapi/network/allocation.py +99 -0
  42. calagoapi/network/manager.py +132 -0
  43. calagoapi/nodes/__init__.py +6 -0
  44. calagoapi/nodes/node.py +477 -0
  45. calagoapi/panel.py +162 -0
  46. calagoapi/schedules/__init__.py +14 -0
  47. calagoapi/schedules/builders.py +461 -0
  48. calagoapi/schedules/manager.py +107 -0
  49. calagoapi/schedules/schedule.py +214 -0
  50. calagoapi/servers/__init__.py +13 -0
  51. calagoapi/servers/admin.py +430 -0
  52. calagoapi/servers/generic.py +785 -0
  53. calagoapi/servers/manager.py +167 -0
  54. calagoapi/servers/minecraft.py +207 -0
  55. calagoapi/tunnels/__init__.py +5 -0
  56. calagoapi/tunnels/tunnel.py +112 -0
  57. calagoapi/users/__init__.py +11 -0
  58. calagoapi/users/activity.py +45 -0
  59. calagoapi/users/subuser.py +127 -0
  60. calagoapi/users/user.py +267 -0
  61. calagoapi/utils/__init__.py +43 -0
  62. calagoapi/utils/convert.py +113 -0
  63. calagoapi/utils/exceptions.py +72 -0
  64. calagoapi/utils/model.py +142 -0
  65. calagoapi/utils/resource.py +100 -0
  66. calagoapi/utils/time.py +68 -0
  67. calagoapi-1.0.dev1.dist-info/METADATA +266 -0
  68. calagoapi-1.0.dev1.dist-info/RECORD +71 -0
  69. calagoapi-1.0.dev1.dist-info/WHEEL +5 -0
  70. calagoapi-1.0.dev1.dist-info/licenses/LICENSE +674 -0
  71. calagoapi-1.0.dev1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,490 @@
1
+ from calagoapi.utils.resource import AdminManager
2
+ from calagoapi.admin.resources import (
3
+ Location,
4
+ Nest,
5
+ Egg,
6
+ Mount,
7
+ Device,
8
+ Role,
9
+ Announcement,
10
+ OAuthProvider,
11
+ DatabaseHost,
12
+ DatabaseAgentHost,
13
+ DatabaseAgentTemplate,
14
+ BackupConfiguration,
15
+ BackupPolicy,
16
+ EggRepository,
17
+ EggConfiguration,
18
+ SubdomainDomain,
19
+ )
20
+ from calagoapi.utils.model import idOf
21
+
22
+
23
+ class LocationManager(AdminManager):
24
+ '''Location management, available as `panel.admin.locations`.'''
25
+ model = Location
26
+
27
+ def getLocations(self, search: str = None, page: int = None, per_page: int = None):
28
+ '''Lists locations.'''
29
+ return self._list(search, page, per_page)
30
+
31
+ def getLocation(self, location_id: str) -> Location:
32
+ '''Returns a location by UUID.'''
33
+ return self._get(location_id)
34
+
35
+ def getLocationByName(self, name: str) -> Location:
36
+ '''Returns a location by exact name, or None.'''
37
+ return self._find(name)
38
+
39
+ def createLocation(self, name: str, description: str = None, flag: str = None, backup_configuration=None) -> Location:
40
+ '''
41
+ Creates a location.
42
+
43
+ Example:
44
+ panel.admin.locations.createLocation('Frankfurt', flag='de')
45
+ '''
46
+ return self._create(name=name, description=description, flag=flag, backup_configuration_uuid=idOf(backup_configuration))
47
+
48
+ def deleteLocation(self, location) -> None:
49
+ '''Deletes a location. It must not contain nodes.'''
50
+ return self._delete(location)
51
+
52
+
53
+ class NestManager(AdminManager):
54
+ '''Nest and egg management, available as `panel.admin.nests`.'''
55
+ model = Nest
56
+
57
+ def getNests(self, search: str = None, page: int = None, per_page: int = None):
58
+ '''Lists nests.'''
59
+ return self._list(search, page, per_page)
60
+
61
+ def getNest(self, nest_id: str) -> Nest:
62
+ '''Returns a nest by UUID.'''
63
+ return self._get(nest_id)
64
+
65
+ def getNestByName(self, name: str) -> Nest:
66
+ '''Returns a nest by exact name, or None.'''
67
+ return self._find(name)
68
+
69
+ def createNest(self, name: str, author: str, description: str = None) -> Nest:
70
+ '''Creates a nest.'''
71
+ return self._create(name=name, author=author, description=description)
72
+
73
+ def deleteNest(self, nest, delete_eggs: bool = False) -> None:
74
+ '''Deletes a nest, optionally with its eggs.'''
75
+ return self._delete(nest, delete_eggs=delete_eggs)
76
+
77
+ def getAllEggs(self) -> list:
78
+ '''
79
+ Returns every egg grouped by nest.
80
+
81
+ Returns:
82
+ List of {'nest': {...}, 'eggs': [...]} dicts.
83
+ '''
84
+ return self.admin.allEggs()
85
+
86
+ def findEgg(self, egg_id_or_name: str):
87
+ '''
88
+ Finds an egg in any nest by UUID or name.
89
+
90
+ Example:
91
+ paper = panel.admin.nests.findEgg('Paper')
92
+ '''
93
+ for entry in self.admin.allEggs():
94
+ for egg in entry.get('eggs', []):
95
+ if egg_id_or_name in (egg.get('uuid'), egg.get('name')):
96
+ return Egg(self.panel, egg, self.admin.eggs(entry['nest']['uuid']))
97
+ return None
98
+
99
+
100
+ class MountManager(AdminManager):
101
+ '''Mount management, available as `panel.admin.mounts`.'''
102
+ model = Mount
103
+
104
+ def getMounts(self, search: str = None, page: int = None, per_page: int = None):
105
+ '''Lists mounts.'''
106
+ return self._list(search, page, per_page)
107
+
108
+ def getMount(self, mount_id: str) -> Mount:
109
+ '''Returns a mount by UUID.'''
110
+ return self._get(mount_id)
111
+
112
+ def createMount(self, name: str, source: str, target: str, read_only: bool = False,
113
+ user_mountable: bool = False, description: str = None) -> Mount:
114
+ '''
115
+ Creates a mount.
116
+
117
+ Args:
118
+ source: Path on the node.
119
+ target: Path inside servers.
120
+ '''
121
+ return self._create(name=name, source=source, target=target, read_only=read_only,
122
+ user_mountable=user_mountable, description=description)
123
+
124
+ def deleteMount(self, mount) -> None:
125
+ '''Deletes a mount.'''
126
+ return self._delete(mount)
127
+
128
+
129
+ class DeviceManager(AdminManager):
130
+ '''Device management, available as `panel.admin.devices`.'''
131
+ model = Device
132
+
133
+ def getDevices(self, search: str = None, page: int = None, per_page: int = None):
134
+ '''Lists devices.'''
135
+ return self._list(search, page, per_page)
136
+
137
+ def getDevice(self, device_id: str) -> Device:
138
+ '''Returns a device by UUID.'''
139
+ return self._get(device_id)
140
+
141
+ def createDevice(self, name: str, source: str, target: str, permissions: str = 'rwm',
142
+ user_attachable: bool = False, description: str = None) -> Device:
143
+ '''Creates a device passthrough.'''
144
+ return self._create(name=name, source=source, target=target, permissions=permissions,
145
+ user_attachable=user_attachable, description=description)
146
+
147
+ def deleteDevice(self, device) -> None:
148
+ '''Deletes a device.'''
149
+ return self._delete(device)
150
+
151
+
152
+ class RoleManager(AdminManager):
153
+ '''Role management, available as `panel.admin.roles`.'''
154
+ model = Role
155
+
156
+ def getRoles(self, search: str = None, page: int = None, per_page: int = None):
157
+ '''Lists roles.'''
158
+ return self._list(search, page, per_page)
159
+
160
+ def getRole(self, role_id: str) -> Role:
161
+ '''Returns a role by UUID.'''
162
+ return self._get(role_id)
163
+
164
+ def getRoleByName(self, name: str) -> Role:
165
+ '''Returns a role by exact name, or None.'''
166
+ return self._find(name)
167
+
168
+ def createRole(self, name: str, admin_permissions: list = None, server_permissions: list = None,
169
+ require_two_factor: bool = False, description: str = None) -> Role:
170
+ '''Creates a role.'''
171
+ return self._create(name=name, admin_permissions=admin_permissions or [], server_permissions=server_permissions or [],
172
+ require_two_factor=require_two_factor, description=description)
173
+
174
+ def deleteRole(self, role) -> None:
175
+ '''Deletes a role.'''
176
+ return self._delete(role)
177
+
178
+
179
+ class AnnouncementManager(AdminManager):
180
+ '''Announcement management, available as `panel.admin.announcements`.'''
181
+ model = Announcement
182
+
183
+ def getAnnouncements(self, search: str = None, page: int = None, per_page: int = None):
184
+ '''Lists announcements.'''
185
+ return self._list(search, page, per_page)
186
+
187
+ def getAnnouncement(self, announcement_id: str) -> Announcement:
188
+ '''Returns an announcement by UUID.'''
189
+ return self._get(announcement_id)
190
+
191
+ def createAnnouncement(self, title: str, content: str, type: str = 'info', enabled: bool = True, dismissible: bool = True,
192
+ locations: list = None, nodes: list = None, eggs: list = None, backup_configurations: list = None,
193
+ enabled_start: str = None, enabled_end: str = None, dismissible_end: str = None) -> Announcement:
194
+ '''
195
+ Creates an announcement.
196
+
197
+ Args:
198
+ title: Title.
199
+ content: Markdown content.
200
+ type: info, success, warning or error.
201
+ locations, nodes, eggs, backup_configurations: Limit who sees it. Everyone when all are empty.
202
+ enabled_start, enabled_end: Optional ISO-8601 time window.
203
+
204
+ Example:
205
+ panel.admin.announcements.createAnnouncement('Maintenance', 'Reboot at 02:00 UTC', type='warning')
206
+ '''
207
+ return self._create(
208
+ type=type,
209
+ title=title,
210
+ content=content,
211
+ enabled=enabled,
212
+ dismissible=dismissible,
213
+ title_translations={},
214
+ content_translations={},
215
+ locations=[idOf(x) for x in locations or []],
216
+ nodes=[idOf(x) for x in nodes or []],
217
+ eggs=[idOf(x) for x in eggs or []],
218
+ backup_configurations=[idOf(x) for x in backup_configurations or []],
219
+ enabled_start=enabled_start,
220
+ enabled_end=enabled_end,
221
+ dismissible_end=dismissible_end,
222
+ )
223
+
224
+ def deleteAnnouncement(self, announcement) -> None:
225
+ '''Deletes an announcement.'''
226
+ return self._delete(announcement)
227
+
228
+
229
+ class OAuthProviderManager(AdminManager):
230
+ '''OAuth provider management, available as `panel.admin.oauth`.'''
231
+ model = OAuthProvider
232
+
233
+ def getProviders(self, search: str = None, page: int = None, per_page: int = None):
234
+ '''Lists OAuth providers.'''
235
+ return self._list(search, page, per_page)
236
+
237
+ def getProvider(self, provider_id: str) -> OAuthProvider:
238
+ '''Returns a provider by UUID.'''
239
+ return self._get(provider_id)
240
+
241
+ def createProvider(self, **fields) -> OAuthProvider:
242
+ '''
243
+ Creates an OAuth provider. Accepts every Calagopus provider field
244
+ (name, client_id, client_secret, auth_url, token_url, info_url, scopes,
245
+ identifier_path, email_path, username_path, enabled, ...).
246
+
247
+ Tip: `discover()` fills most fields from an OpenID issuer URL.
248
+ '''
249
+ defaults = {
250
+ 'enabled': True,
251
+ 'login_only': False,
252
+ 'login_bypass_two_factor': False,
253
+ 'link_viewable': True,
254
+ 'user_manageable': True,
255
+ 'basic_auth': False,
256
+ 'scopes': [],
257
+ }
258
+ return self._create(**{**defaults, **fields})
259
+
260
+ def discover(self, url: str) -> dict:
261
+ '''Reads an OpenID Connect discovery document and returns suggested provider settings.'''
262
+ return self.admin.discoverOauthProvider(url)
263
+
264
+ def deleteProvider(self, provider) -> None:
265
+ '''Deletes an OAuth provider.'''
266
+ return self._delete(provider)
267
+
268
+
269
+ class DatabaseHostManager(AdminManager):
270
+ '''Database host management, available as `panel.admin.database_hosts`.'''
271
+ model = DatabaseHost
272
+
273
+ def getDatabaseHosts(self, search: str = None, page: int = None, per_page: int = None):
274
+ '''Lists database hosts.'''
275
+ return self._list(search, page, per_page)
276
+
277
+ def getDatabaseHost(self, host_id: str) -> DatabaseHost:
278
+ '''Returns a database host by UUID.'''
279
+ return self._get(host_id)
280
+
281
+ def createDatabaseHost(self, name: str, type: str, credentials: dict, public_host: str = None, public_port: int = None,
282
+ deployment_enabled: bool = True, maintenance_enabled: bool = False) -> DatabaseHost:
283
+ '''
284
+ Creates a database host.
285
+
286
+ Args:
287
+ type: mysql, postgres or mongodb.
288
+ credentials: Connection credentials (host, port, username, password, ...).
289
+ '''
290
+ return self._create(name=name, type=type, credentials=credentials, public_host=public_host, public_port=public_port,
291
+ deployment_enabled=deployment_enabled, maintenance_enabled=maintenance_enabled)
292
+
293
+ def deleteDatabaseHost(self, host, force: bool = False) -> None:
294
+ '''Deletes a database host.'''
295
+ return self._delete(host, force=force)
296
+
297
+
298
+ class DatabaseAgentHostManager(AdminManager):
299
+ '''Database agent host management, available as `panel.admin.database_agent_hosts`.'''
300
+ model = DatabaseAgentHost
301
+
302
+ def getDatabaseAgentHosts(self, search: str = None, page: int = None, per_page: int = None):
303
+ '''Lists database agent hosts.'''
304
+ return self._list(search, page, per_page)
305
+
306
+ def getDatabaseAgentHost(self, host_id: str) -> DatabaseAgentHost:
307
+ '''Returns a database agent host by UUID.'''
308
+ return self._get(host_id)
309
+
310
+ def createDatabaseAgentHost(self, name: str, url: str, memory: int, disk: int, types: list = None,
311
+ deployment_enabled: bool = True, maintenance_enabled: bool = False,
312
+ description: str = None) -> DatabaseAgentHost:
313
+ '''Creates a database agent host.'''
314
+ return self._create(name=name, url=url, memory=memory, disk=disk, types=types, description=description,
315
+ deployment_enabled=deployment_enabled, maintenance_enabled=maintenance_enabled)
316
+
317
+ def deleteDatabaseAgentHost(self, host, force: bool = False) -> None:
318
+ '''Deletes a database agent host.'''
319
+ return self._delete(host, force=force)
320
+
321
+ def getCapacities(self) -> dict:
322
+ '''Returns allocated resources of every host.'''
323
+ return self.admin.databaseAgentCapacities()
324
+
325
+ def updateConfigs(self, hosts: list, config: dict) -> dict:
326
+ '''Applies the same configuration change to several hosts.'''
327
+ return self.admin.updateDatabaseAgentHostsConfig([idOf(h) for h in hosts], config)
328
+
329
+
330
+ class DatabaseAgentTemplateManager(AdminManager):
331
+ '''Database instance template management, available as `panel.admin.database_templates`.'''
332
+ model = DatabaseAgentTemplate
333
+
334
+ def getTemplates(self, search: str = None, page: int = None, per_page: int = None):
335
+ '''Lists templates.'''
336
+ return self._list(search, page, per_page)
337
+
338
+ def getTemplate(self, template_id: str) -> DatabaseAgentTemplate:
339
+ '''Returns a template by UUID.'''
340
+ return self._get(template_id)
341
+
342
+ def createTemplate(self, **fields) -> DatabaseAgentTemplate:
343
+ '''
344
+ Creates a template. Accepts every Calagopus template field (name, type,
345
+ docker_images, env, image_uid, image_gid, volumes, socket_path, memory,
346
+ swap, disk, cpu, deployment_enabled, ...).
347
+ '''
348
+ return self._create(**fields)
349
+
350
+ def deleteTemplate(self, template) -> None:
351
+ '''Deletes a template.'''
352
+ return self._delete(template)
353
+
354
+
355
+ class BackupConfigurationManager(AdminManager):
356
+ '''Backup configuration management, available as `panel.admin.backup_configurations`.'''
357
+ model = BackupConfiguration
358
+
359
+ def getBackupConfigurations(self, search: str = None, page: int = None, per_page: int = None):
360
+ '''Lists backup configurations.'''
361
+ return self._list(search, page, per_page)
362
+
363
+ def getBackupConfiguration(self, configuration_id: str) -> BackupConfiguration:
364
+ '''Returns a backup configuration by UUID.'''
365
+ return self._get(configuration_id)
366
+
367
+ def createBackupConfiguration(self, name: str, backup_disk: str, backup_configs: dict, shared: bool = False,
368
+ maintenance_enabled: bool = False, description: str = None) -> BackupConfiguration:
369
+ '''
370
+ Creates a backup configuration.
371
+
372
+ Args:
373
+ backup_disk: local, s3, ddup-bak, btrfs, zfs, restic, proxmox-backup-server or kopia.
374
+ backup_configs: Driver settings.
375
+ '''
376
+ return self._create(name=name, backup_disk=backup_disk, backup_configs=backup_configs, shared=shared,
377
+ maintenance_enabled=maintenance_enabled, description=description)
378
+
379
+ def testBackupConfiguration(self, node, backup_disk: str, backup_configs: dict) -> dict:
380
+ '''Tests storage settings from a node before saving them.'''
381
+ return self.admin.testBackupConfiguration(idOf(node), backup_disk, backup_configs)
382
+
383
+ def deleteBackupConfiguration(self, configuration) -> None:
384
+ '''Deletes a backup configuration.'''
385
+ return self._delete(configuration)
386
+
387
+
388
+ class BackupPolicyManager(AdminManager):
389
+ '''Panel-wide backup policies, available as `panel.admin.backup_policies`.'''
390
+ model = BackupPolicy
391
+
392
+ def getBackupPolicies(self, search: str = None, page: int = None, per_page: int = None):
393
+ '''Lists backup policies.'''
394
+ return self._list(search, page, per_page)
395
+
396
+ def getBackupPolicy(self, policy_id: str) -> BackupPolicy:
397
+ '''Returns a backup policy by UUID.'''
398
+ return self._get(policy_id)
399
+
400
+ def createBackupPolicy(self, name: str, cron: str, enabled: bool = True, parallelism: int = 1, retention: dict = None,
401
+ backup_configuration=None, kind: str = None, description: str = None) -> BackupPolicy:
402
+ '''
403
+ Creates a backup policy.
404
+
405
+ Args:
406
+ cron: 6-field cron expression (seconds first).
407
+ parallelism: How many backups run at the same time.
408
+ '''
409
+ return self._create(name=name, cron=cron, enabled=enabled, parallelism=parallelism, retention=retention,
410
+ backup_configuration_uuid=idOf(backup_configuration), kind=kind, description=description)
411
+
412
+ def deleteBackupPolicy(self, policy, delete_backups: bool = False) -> None:
413
+ '''Deletes a backup policy.'''
414
+ return self._delete(policy, delete_backups=delete_backups)
415
+
416
+
417
+ class EggRepositoryManager(AdminManager):
418
+ '''Egg repository management, available as `panel.admin.egg_repositories`.'''
419
+ model = EggRepository
420
+
421
+ def getEggRepositories(self, search: str = None, page: int = None, per_page: int = None):
422
+ '''Lists egg repositories.'''
423
+ return self._list(search, page, per_page)
424
+
425
+ def getEggRepository(self, repository_id: str) -> EggRepository:
426
+ '''Returns an egg repository by UUID.'''
427
+ return self._get(repository_id)
428
+
429
+ def createEggRepository(self, name: str, git_repository: str, description: str = None, credentials: dict = None) -> EggRepository:
430
+ '''Adds an egg repository.'''
431
+ return self._create(name=name, git_repository=git_repository, description=description, credentials=credentials)
432
+
433
+ def deleteEggRepository(self, repository) -> None:
434
+ '''Deletes an egg repository.'''
435
+ return self._delete(repository)
436
+
437
+
438
+ class EggConfigurationManager(AdminManager):
439
+ '''Egg configuration rules, available as `panel.admin.egg_configurations`.'''
440
+ model = EggConfiguration
441
+
442
+ def getEggConfigurations(self, search: str = None, page: int = None, per_page: int = None):
443
+ '''Lists egg configurations.'''
444
+ return self._list(search, page, per_page)
445
+
446
+ def getEggConfiguration(self, configuration_id: str) -> EggConfiguration:
447
+ '''Returns an egg configuration by UUID.'''
448
+ return self._get(configuration_id)
449
+
450
+ def createEggConfiguration(self, name: str, matcher: dict, order: int = 0, **fields) -> EggConfiguration:
451
+ '''Creates an egg configuration. Extra fields: config_allocations, config_startup, config_routes, config_features.'''
452
+ return self._create(name=name, matcher=matcher, order=order, **fields)
453
+
454
+ def deleteEggConfiguration(self, configuration) -> None:
455
+ '''Deletes an egg configuration.'''
456
+ return self._delete(configuration)
457
+
458
+
459
+ class SubdomainDomainManager(AdminManager):
460
+ '''Subdomain Manager domains, available as `panel.admin.subdomain_domains`.'''
461
+ model = SubdomainDomain
462
+
463
+ def getDomains(self, search: str = None, page: int = None, per_page: int = None):
464
+ '''Lists domains.'''
465
+ return self._list(search, page, per_page)
466
+
467
+ def getDomain(self, domain_id_or_name: str) -> SubdomainDomain:
468
+ '''Returns a domain by UUID or domain name, or None.'''
469
+ for domain in self.getDomains():
470
+ if domain_id_or_name in (domain.getUUID(), domain.getDomain()):
471
+ return domain
472
+ return None
473
+
474
+ def createDomain(self, domain: str, provider: str, provider_config: dict, eggs: list = None,
475
+ disallowed_subdomains_regexes: list = None) -> SubdomainDomain:
476
+ '''
477
+ Adds a domain.
478
+
479
+ Args:
480
+ domain: e.g. "example.com".
481
+ provider: cloudflare or powerdns.
482
+ provider_config: Provider credentials.
483
+ eggs: Eggs allowed to use the domain. All when empty.
484
+ '''
485
+ return self._create(domain=domain, provider=provider, provider_config=provider_config,
486
+ eggs=[idOf(e) for e in eggs or []], disallowed_subdomains_regexes=disallowed_subdomains_regexes or [])
487
+
488
+ def deleteDomain(self, domain) -> None:
489
+ '''Deletes a domain.'''
490
+ return self._delete(domain)