mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Fix system id usage
This commit is contained in:
parent
fb08deda3f
commit
79e2bb76e9
@ -44,36 +44,48 @@ class MaasManager:
|
|||||||
|
|
||||||
extension = json_data.get("externaldetails", {}).get("extension", {})
|
extension = json_data.get("externaldetails", {}).get("extension", {})
|
||||||
host = json_data.get("externaldetails", {}).get("host", {})
|
host = json_data.get("externaldetails", {}).get("host", {})
|
||||||
|
vm = json_data.get("externaldetails", {}).get("virtualmachine", {})
|
||||||
|
|
||||||
endpoint = host.get("endpoint") or extension.get("endpoint")
|
endpoint = host.get("endpoint") or extension.get("endpoint")
|
||||||
apikey = host.get("apikey") or extension.get("apikey")
|
apikey = host.get("apikey") or extension.get("apikey")
|
||||||
distro_series = (
|
distro_series = (
|
||||||
json_data.get("cloudstack.vm.details", {})
|
json_data.get("cloudstack.vm.details", {})
|
||||||
.get("details", {})
|
.get("details", {})
|
||||||
.get("distro_series", "ubuntu")
|
.get("distro_series", None)
|
||||||
)
|
)
|
||||||
|
|
||||||
if not endpoint or not apikey:
|
if not endpoint or not apikey:
|
||||||
fail("Missing MAAS endpoint or apikey")
|
fail("Missing MAAS endpoint or apikey")
|
||||||
|
|
||||||
# normalize endpoint
|
|
||||||
if not endpoint.startswith("http://") and not endpoint.startswith("https://"):
|
if not endpoint.startswith("http://") and not endpoint.startswith("https://"):
|
||||||
endpoint = "http://" + endpoint
|
endpoint = "http://" + endpoint
|
||||||
endpoint = endpoint.rstrip("/")
|
endpoint = endpoint.rstrip("/")
|
||||||
|
|
||||||
# split api key
|
|
||||||
parts = apikey.split(":")
|
parts = apikey.split(":")
|
||||||
if len(parts) != 3:
|
if len(parts) != 3:
|
||||||
fail("Invalid apikey format. Expected consumer:token:secret")
|
fail("Invalid apikey format. Expected consumer:token:secret")
|
||||||
|
|
||||||
consumer, token, secret = parts
|
consumer, token, secret = parts
|
||||||
|
|
||||||
|
system_id = (
|
||||||
|
json_data.get("cloudstack.vm.details", {})
|
||||||
|
.get("details", {})
|
||||||
|
.get("maas_system_id")
|
||||||
|
or vm.get("maas_system_id", "")
|
||||||
|
)
|
||||||
|
|
||||||
|
vm_name = vm.get("vm_name") or json_data.get("cloudstack.vm.details", {}).get("name")
|
||||||
|
if not vm_name:
|
||||||
|
vm_name = f"cs-{system_id}" if system_id else "cs-unknown"
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"endpoint": endpoint,
|
"endpoint": endpoint,
|
||||||
"consumer": consumer,
|
"consumer": consumer,
|
||||||
"token": token,
|
"token": token,
|
||||||
"secret": secret,
|
"secret": secret,
|
||||||
"distro_series": distro_series,
|
"distro_series": distro_series or "ubuntu/focal",
|
||||||
"system_id": json_data.get("cloudstack.vm.details", {}).get("details", {}).get("maas_system_id", ""),
|
"system_id": system_id,
|
||||||
|
"vm_name": vm_name,
|
||||||
}
|
}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
fail(f"Error parsing JSON: {str(e)}")
|
fail(f"Error parsing JSON: {str(e)}")
|
||||||
@ -103,9 +115,19 @@ class MaasManager:
|
|||||||
if not ready:
|
if not ready:
|
||||||
fail("No Ready machines available")
|
fail("No Ready machines available")
|
||||||
|
|
||||||
system = ready[0]
|
sysid = self.data.get("system_id")
|
||||||
|
|
||||||
|
if sysid:
|
||||||
|
match = next((m for m in ready if m["system_id"] == sysid), None)
|
||||||
|
if not match:
|
||||||
|
fail(f"Provided system_id '{sysid}' not found among Ready machines")
|
||||||
|
system = match
|
||||||
|
else:
|
||||||
|
system = ready[0]
|
||||||
|
|
||||||
system_id = system["system_id"]
|
system_id = system["system_id"]
|
||||||
mac = system.get("interface_set", [{}])[0].get("mac_address")
|
mac = system.get("interface_set", [{}])[0].get("mac_address")
|
||||||
|
hostname = system.get("hostname", "")
|
||||||
|
|
||||||
if not mac:
|
if not mac:
|
||||||
fail("No MAC address found")
|
fail("No MAC address found")
|
||||||
@ -119,7 +141,11 @@ class MaasManager:
|
|||||||
|
|
||||||
result = {
|
result = {
|
||||||
"nics": json_data["cloudstack.vm.details"]["nics"],
|
"nics": json_data["cloudstack.vm.details"]["nics"],
|
||||||
"details": {"External:mac_address": mac, "maas_system_id": system_id},
|
"details": {
|
||||||
|
"External:mac_address": mac,
|
||||||
|
"External:maas_system_id": system_id,
|
||||||
|
"External:hostname": hostname,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
succeed(result)
|
succeed(result)
|
||||||
|
|
||||||
@ -127,10 +153,26 @@ class MaasManager:
|
|||||||
sysid = self.data.get("system_id")
|
sysid = self.data.get("system_id")
|
||||||
if not sysid:
|
if not sysid:
|
||||||
fail("system_id missing for create")
|
fail("system_id missing for create")
|
||||||
|
|
||||||
|
ds = self.data.get("distro_series", "ubuntu/focal")
|
||||||
|
vm_name = self.data.get("vm_name")
|
||||||
|
|
||||||
|
# Cloud-init userdata to disable netplan, flush IPs on ens35, and run dhclient
|
||||||
|
userdata = """#cloud-config
|
||||||
|
network:
|
||||||
|
config: disabled
|
||||||
|
runcmd:
|
||||||
|
- [ sh, -c, "dhclient -v -4 ens35 || true" ]
|
||||||
|
"""
|
||||||
|
|
||||||
self.call_maas(
|
self.call_maas(
|
||||||
"POST",
|
"POST",
|
||||||
f"/machines/{sysid}/",
|
f"/machines/{sysid}/",
|
||||||
{"op": "deploy", "distro_series": self.data["distro_series"]},
|
{
|
||||||
|
"op": "deploy",
|
||||||
|
"distro_series": ds,
|
||||||
|
"userdata": userdata,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
succeed({"status": "success", "message": f"Instance created with {self.data['distro_series']}"})
|
succeed({"status": "success", "message": f"Instance created with {self.data['distro_series']}"})
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user