mtn-cloud 0.2.7__tar.gz → 0.2.10__tar.gz
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.
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/PKG-INFO +2 -11
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/README.md +1 -10
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/advanced-cookbook.md +2 -1
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/instances.md +3 -3
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/quickstart.md +1 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/_version.py +1 -1
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/client.py +1 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/instance.py +5 -4
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/instances.py +2 -2
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_config.py +19 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_instances.py +4 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/.gitignore +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/LICENSE +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-overview.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/archive-buckets.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/client.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/clouds.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/groups.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/index.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/instance-types.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/networks.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/plans.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/api-reference/storage-buckets.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/docstring-style.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/index.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/instances.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/networking.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/storage.md +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/docs/stylesheets/extra.css +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/pyproject.toml +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/__init__.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/config.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/exceptions.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/http.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/__init__.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/archive.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/base.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/cloud.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/group.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/instance_type.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/network.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/plan.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/storage_bucket.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/user.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/models/volume.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/__init__.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/archive_buckets.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/base.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/clouds.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/groups.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/instance_types.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/networks.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/plans.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/src/mtn_cloud/resources/storage_buckets.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/__init__.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/conftest.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_archive_buckets.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_client.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_clouds.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_exceptions.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_instance_types.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_networks.py +0 -0
- {mtn_cloud-0.2.7 → mtn_cloud-0.2.10}/tests/test_storage_buckets.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mtn-cloud
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.10
|
|
4
4
|
Summary: Community Python SDK for MTN Cloud - Deploy and manage cloud resources with ease
|
|
5
5
|
Project-URL: Homepage, https://github.com/mahveotm/mtn-cloud-python
|
|
6
6
|
Project-URL: Documentation, https://github.com/mahveotm/mtn-cloud-python#readme
|
|
@@ -132,20 +132,10 @@ groups = cloud.groups.list()
|
|
|
132
132
|
for group in groups[:5]:
|
|
133
133
|
print(group.id, group.name)
|
|
134
134
|
|
|
135
|
-
# Clouds/zones
|
|
136
|
-
clouds = cloud.clouds.list_openstack()
|
|
137
|
-
for c in clouds[:5]:
|
|
138
|
-
print(c.id, c.name, c.type_code)
|
|
139
|
-
|
|
140
135
|
# Instance types
|
|
141
136
|
types = cloud.instance_types.list_os()
|
|
142
137
|
for t in types[:5]:
|
|
143
138
|
print(t.code, t.name, t.default_layout_id)
|
|
144
|
-
|
|
145
|
-
# Service plans
|
|
146
|
-
plans = cloud.plans.list()
|
|
147
|
-
for p in plans[:5]:
|
|
148
|
-
print(p.id, p.name, p.cores, p.memory_gb)
|
|
149
139
|
```
|
|
150
140
|
|
|
151
141
|
### 2. Create an Instance
|
|
@@ -158,6 +148,7 @@ instance = cloud.instances.create(
|
|
|
158
148
|
group="MTNNG_CLOUD_AZ_1",
|
|
159
149
|
layout=327,
|
|
160
150
|
plan=6776,
|
|
151
|
+
resource_pool_id="pool-214",
|
|
161
152
|
labels=["production", "web"],
|
|
162
153
|
)
|
|
163
154
|
|
|
@@ -88,20 +88,10 @@ groups = cloud.groups.list()
|
|
|
88
88
|
for group in groups[:5]:
|
|
89
89
|
print(group.id, group.name)
|
|
90
90
|
|
|
91
|
-
# Clouds/zones
|
|
92
|
-
clouds = cloud.clouds.list_openstack()
|
|
93
|
-
for c in clouds[:5]:
|
|
94
|
-
print(c.id, c.name, c.type_code)
|
|
95
|
-
|
|
96
91
|
# Instance types
|
|
97
92
|
types = cloud.instance_types.list_os()
|
|
98
93
|
for t in types[:5]:
|
|
99
94
|
print(t.code, t.name, t.default_layout_id)
|
|
100
|
-
|
|
101
|
-
# Service plans
|
|
102
|
-
plans = cloud.plans.list()
|
|
103
|
-
for p in plans[:5]:
|
|
104
|
-
print(p.id, p.name, p.cores, p.memory_gb)
|
|
105
95
|
```
|
|
106
96
|
|
|
107
97
|
### 2. Create an Instance
|
|
@@ -114,6 +104,7 @@ instance = cloud.instances.create(
|
|
|
114
104
|
group="MTNNG_CLOUD_AZ_1",
|
|
115
105
|
layout=327,
|
|
116
106
|
plan=6776,
|
|
107
|
+
resource_pool_id="pool-214",
|
|
117
108
|
labels=["production", "web"],
|
|
118
109
|
)
|
|
119
110
|
|
|
@@ -154,6 +154,7 @@ instance = cloud.instances.create(
|
|
|
154
154
|
group="MTNNG_CLOUD_AZ_1",
|
|
155
155
|
layout=target_type.default_layout_id,
|
|
156
156
|
plan=target_plan.id,
|
|
157
|
+
resource_pool_id="pool-214",
|
|
157
158
|
)
|
|
158
159
|
```
|
|
159
160
|
|
|
@@ -172,7 +173,7 @@ instance = cloud.instances.create(
|
|
|
172
173
|
group="MTNNG_CLOUD_AZ_1",
|
|
173
174
|
layout=309,
|
|
174
175
|
plan=6776,
|
|
176
|
+
resource_pool_id="pool-214",
|
|
175
177
|
)
|
|
176
178
|
logger.info("instance-created id=%s status=%s", instance.id, instance.status)
|
|
177
179
|
```
|
|
178
|
-
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
- common API exceptions
|
|
33
33
|
- `NotFoundError` when no instance matches
|
|
34
34
|
|
|
35
|
-
### `create(name: str, *, cloud: str, type: str, group: str, layout: int, plan: int, description=None, environment=None, labels=None, tags=None, copies=1, layout_size=1,
|
|
35
|
+
### `create(name: str, *, cloud: str, type: str, group: str, layout: int, plan: int, resource_pool_id: str, description=None, environment=None, labels=None, tags=None, copies=1, layout_size=1, availability_zone=None, security_group="default", os_external_network_id=None, create_user=True, workflow_id=None, shutdown_days=None, expire_days=None, create_backup=None, security_groups=None, ports=None, volumes=None, network_interfaces=None, options=None) -> Instance`
|
|
36
36
|
|
|
37
37
|
- Endpoint sequence:
|
|
38
38
|
- `GET /api/groups?name=<group>&max=1` (resolve group name to `group_id`)
|
|
@@ -45,12 +45,13 @@
|
|
|
45
45
|
- `group`: group/site name (resolved to ID)
|
|
46
46
|
- `layout`: layout ID
|
|
47
47
|
- `plan`: service plan ID
|
|
48
|
+
- `resource_pool_id`: project resource pool ID
|
|
48
49
|
- Optional metadata:
|
|
49
50
|
- `description`, `environment`, `labels`, `tags`
|
|
50
51
|
- Optional sizing/provisioning:
|
|
51
52
|
- `copies`, `layout_size`
|
|
52
53
|
- Optional MTN/OpenStack-specific provisioning:
|
|
53
|
-
- `
|
|
54
|
+
- `availability_zone`, `security_group`, `os_external_network_id`, `create_user`
|
|
54
55
|
- Optional automation:
|
|
55
56
|
- `workflow_id`, `shutdown_days`, `expire_days`, `create_backup`
|
|
56
57
|
- Optional networking/storage details:
|
|
@@ -164,4 +165,3 @@ Client-side polling helper.
|
|
|
164
165
|
- `max_results`: maps to query `max`
|
|
165
166
|
- Returns: list from response key `processes`
|
|
166
167
|
- Raises: common API exceptions
|
|
167
|
-
|
|
@@ -329,8 +329,10 @@ class InstanceCreate(BaseModel):
|
|
|
329
329
|
)
|
|
330
330
|
|
|
331
331
|
# MTN Cloud Config Options
|
|
332
|
-
resource_pool_id: str
|
|
333
|
-
|
|
332
|
+
resource_pool_id: str = Field(
|
|
333
|
+
...,
|
|
334
|
+
min_length=1,
|
|
335
|
+
description="Resource pool ID (e.g., 'pool-214')",
|
|
334
336
|
)
|
|
335
337
|
availability_zone: str | None = Field(
|
|
336
338
|
default=None, description="Availability zone (e.g., 'Lagos-AZ-1-fd1')"
|
|
@@ -416,8 +418,7 @@ class InstanceCreate(BaseModel):
|
|
|
416
418
|
# MTN Cloud config at root level
|
|
417
419
|
config: dict[str, Any] = {}
|
|
418
420
|
|
|
419
|
-
|
|
420
|
-
config["resourcePoolId"] = self.resource_pool_id
|
|
421
|
+
config["resourcePoolId"] = self.resource_pool_id
|
|
421
422
|
if self.availability_zone is not None:
|
|
422
423
|
config["availabilityZone"] = self.availability_zone
|
|
423
424
|
if self.security_group is not None:
|
|
@@ -170,6 +170,7 @@ class InstancesResource(BaseResource[Instance]):
|
|
|
170
170
|
group: str,
|
|
171
171
|
layout: int,
|
|
172
172
|
plan: int,
|
|
173
|
+
resource_pool_id: str,
|
|
173
174
|
description: str | None = None,
|
|
174
175
|
environment: str | None = None,
|
|
175
176
|
labels: List[str] | None = None,
|
|
@@ -177,7 +178,6 @@ class InstancesResource(BaseResource[Instance]):
|
|
|
177
178
|
copies: int = 1,
|
|
178
179
|
layout_size: int = 1,
|
|
179
180
|
# MTN Cloud config options
|
|
180
|
-
resource_pool_id: str | None = None,
|
|
181
181
|
availability_zone: str | None = None,
|
|
182
182
|
security_group: str = "default",
|
|
183
183
|
os_external_network_id: str | None = None,
|
|
@@ -205,13 +205,13 @@ class InstancesResource(BaseResource[Instance]):
|
|
|
205
205
|
group: Group name (e.g., 'MTNNG_CLOUD_AZ_1') - will be resolved to ID automatically
|
|
206
206
|
layout: Layout ID (e.g., 327)
|
|
207
207
|
plan: Service plan ID (e.g., 6923)
|
|
208
|
+
resource_pool_id: Resource pool ID (e.g., 'pool-214')
|
|
208
209
|
description: Instance description
|
|
209
210
|
environment: Environment code
|
|
210
211
|
labels: Labels (keywords) list
|
|
211
212
|
tags: Metadata tags dict (e.g., {"env": "prod"})
|
|
212
213
|
copies: Number of copies to provision
|
|
213
214
|
layout_size: Multiply factor of containers/vms
|
|
214
|
-
resource_pool_id: Resource pool ID (e.g., 'pool-214')
|
|
215
215
|
availability_zone: Availability zone (e.g., 'Lagos-AZ-1-fd1')
|
|
216
216
|
security_group: Security group name (default: 'default')
|
|
217
217
|
os_external_network_id: External network for floating IP (e.g., 'public-network-01')
|
|
@@ -13,6 +13,25 @@ from mtn_cloud.config import MTNCloudConfig
|
|
|
13
13
|
class TestMTNCloudConfig:
|
|
14
14
|
"""Tests for configuration."""
|
|
15
15
|
|
|
16
|
+
@pytest.fixture(autouse=True)
|
|
17
|
+
def _clear_mtn_cloud_env(self, monkeypatch):
|
|
18
|
+
"""Ensure host MTN_CLOUD_* env vars do not leak into config tests."""
|
|
19
|
+
keys = (
|
|
20
|
+
"MTN_CLOUD_TOKEN",
|
|
21
|
+
"MTN_CLOUD_USERNAME",
|
|
22
|
+
"MTN_CLOUD_PASSWORD",
|
|
23
|
+
"MTN_CLOUD_URL",
|
|
24
|
+
"MTN_CLOUD_API_VERSION",
|
|
25
|
+
"MTN_CLOUD_TIMEOUT",
|
|
26
|
+
"MTN_CLOUD_MAX_RETRIES",
|
|
27
|
+
"MTN_CLOUD_RETRY_DELAY",
|
|
28
|
+
"MTN_CLOUD_VERIFY_SSL",
|
|
29
|
+
"MTN_CLOUD_USER_AGENT",
|
|
30
|
+
"MTN_CLOUD_DEBUG",
|
|
31
|
+
)
|
|
32
|
+
for key in keys:
|
|
33
|
+
monkeypatch.delenv(key, raising=False)
|
|
34
|
+
|
|
16
35
|
def test_default_values(self):
|
|
17
36
|
"""Test default configuration values."""
|
|
18
37
|
config = MTNCloudConfig()
|
|
@@ -63,6 +63,7 @@ class TestInstanceCreate:
|
|
|
63
63
|
group_id=621, # Group ID is resolved by the resource
|
|
64
64
|
layout=327,
|
|
65
65
|
plan=6923,
|
|
66
|
+
resource_pool_id="pool-214",
|
|
66
67
|
)
|
|
67
68
|
|
|
68
69
|
payload = create.to_api_payload()
|
|
@@ -74,6 +75,7 @@ class TestInstanceCreate:
|
|
|
74
75
|
assert payload["instance"]["site"]["id"] == 621
|
|
75
76
|
assert payload["instance"]["layout"]["id"] == 327
|
|
76
77
|
assert payload["instance"]["plan"]["id"] == 6923
|
|
78
|
+
assert payload["config"]["resourcePoolId"] == "pool-214"
|
|
77
79
|
|
|
78
80
|
def test_create_with_mtn_cloud_config(self):
|
|
79
81
|
"""Test create payload with MTN Cloud config options."""
|
|
@@ -108,6 +110,7 @@ class TestInstanceCreate:
|
|
|
108
110
|
group_id=621,
|
|
109
111
|
layout=327,
|
|
110
112
|
plan=6923,
|
|
113
|
+
resource_pool_id="pool-214",
|
|
111
114
|
volumes=volumes,
|
|
112
115
|
)
|
|
113
116
|
|
|
@@ -128,6 +131,7 @@ class TestInstanceCreate:
|
|
|
128
131
|
group_id=621,
|
|
129
132
|
layout=327,
|
|
130
133
|
plan=6923,
|
|
134
|
+
resource_pool_id="pool-214",
|
|
131
135
|
network_interfaces=networks,
|
|
132
136
|
)
|
|
133
137
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|