Source code for saltext.vcf.clients.vcenter_datacenter

"""Resource layer for vCenter datacenters (/api/vcenter/datacenter)."""

import requests

from saltext.vcf.utils import vcenter

PATH = "/api/vcenter/datacenter"
FOLDER_PATH = "/api/vcenter/folder"


def list_(opts, profile=None):
    return vcenter.api_get(opts, PATH, profile=profile)


[docs] def get(opts, datacenter, profile=None): """Get a datacenter by its managed object id (e.g. ``datacenter-1``).""" return vcenter.api_get(opts, f"{PATH}/{datacenter}", profile=profile)
[docs] def get_or_none(opts, datacenter, profile=None): """Get a datacenter by managed-object id, returning ``None`` on 404.""" try: return get(opts, datacenter, profile=profile) except requests.HTTPError as exc: if exc.response is not None and exc.response.status_code == 404: return None raise
[docs] def get_by_name(opts, name, profile=None): """Return the datacenter summary matching *name*, or ``None``. The vCenter REST API addresses datacenters by managed-object id, not by display name, so existence checks by name must go through the list endpoint with a ``names`` filter rather than ``GET /datacenter/{name}`` (which would 404 for any real display name and break idempotency). """ results = vcenter.api_get(opts, PATH, params={"names": name}, profile=profile) if isinstance(results, list) and results: return results[0] return None
def _default_datacenter_folder(opts, profile=None): """Return a folder MoID suitable for creating a datacenter. vCenter's ``POST /datacenter`` currently requires the ``folder`` field. When the caller does not supply one, pick the first DATACENTER-type folder. """ folders = vcenter.api_get(opts, FOLDER_PATH, params={"type": "DATACENTER"}, profile=profile) if isinstance(folders, list) and folders: return folders[0]["folder"] raise ValueError( "No DATACENTER-type folder found in vCenter; cannot determine a parent " "folder for datacenter creation. Pass an explicit 'folder' MoID." ) def create(opts, name, folder=None, profile=None): if folder is None: folder = _default_datacenter_folder(opts, profile=profile) body = {"name": name, "folder": folder} return vcenter.api_post(opts, PATH, body=body, profile=profile) def delete(opts, datacenter, profile=None): return vcenter.api_delete(opts, f"{PATH}/{datacenter}", profile=profile)