Split metadata into independent services
Handling metadata in single module becomes not manageable. Split it into separate service-related modules. Change-Id: I7551b4a96cf030c57bfb0a7b9eb868cd760a6de5
This commit is contained in:
parent
fddec42f7e
commit
8ecbde6b05
File diff suppressed because it is too large
Load Diff
669
codegenerator/metadata/__init__.py
Normal file
669
codegenerator/metadata/__init__.py
Normal file
@ -0,0 +1,669 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
from abc import ABC, abstractmethod
|
||||
from pathlib import Path
|
||||
import logging
|
||||
import re
|
||||
import typing as ty
|
||||
|
||||
import jsonref
|
||||
from ruamel.yaml import YAML
|
||||
|
||||
from codegenerator.base import BaseGenerator
|
||||
from codegenerator import common
|
||||
from codegenerator.common.schema import SpecSchema
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
from codegenerator.metadata.baremetal import BaremetalMetadata
|
||||
from codegenerator.metadata.block_storage import BlockStorageMetadata
|
||||
from codegenerator.metadata.compute import ComputeMetadata
|
||||
from codegenerator.metadata.dns import DnsMetadata
|
||||
from codegenerator.metadata.identity import IdentityMetadata
|
||||
from codegenerator.metadata.image import ImageMetadata
|
||||
from codegenerator.metadata.load_balancer import LoadBalancerMetadata
|
||||
from codegenerator.metadata.network import NetworkMetadata
|
||||
from codegenerator.metadata.object_store import ObjectStorageMetadata
|
||||
from codegenerator.metadata.placement import PlacementMetadata
|
||||
from codegenerator.metadata.shared_file_system import SharedFileSystemMetadata
|
||||
from codegenerator.types import Metadata
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.types import OperationTargetParams
|
||||
from codegenerator.types import ResourceModel
|
||||
|
||||
|
||||
OPERATION_ID_BLACKLIST: set[str] = {
|
||||
# # BlockStorage
|
||||
# ## Host put has no schema
|
||||
"project_id/os-hosts:put",
|
||||
"os-hosts:put",
|
||||
"project_id/os-hosts/id:put",
|
||||
"os-hosts/id:put",
|
||||
}
|
||||
|
||||
SERVICE_METADATA_MAP: dict[str, ty.Type[MetadataBase]] = {
|
||||
"baremetal": BaremetalMetadata,
|
||||
"block-storage": BlockStorageMetadata,
|
||||
"volume": BlockStorageMetadata,
|
||||
"compute": ComputeMetadata,
|
||||
"dns": DnsMetadata,
|
||||
"identity": IdentityMetadata,
|
||||
"image": ImageMetadata,
|
||||
"load-balancer": LoadBalancerMetadata,
|
||||
"network": NetworkMetadata,
|
||||
"object-store": ObjectStorageMetadata,
|
||||
"placement": PlacementMetadata,
|
||||
"shared-file-system": SharedFileSystemMetadata,
|
||||
}
|
||||
|
||||
|
||||
class MetadataGenerator(BaseGenerator):
|
||||
"""Generate metadata from OpenAPI spec"""
|
||||
|
||||
def load_openapi(self, path):
|
||||
"""Load existing OpenAPI spec from the file"""
|
||||
if not path.exists():
|
||||
return
|
||||
yaml = YAML(typ="safe")
|
||||
with open(path) as fp:
|
||||
spec = jsonref.replace_refs(yaml.load(fp))
|
||||
|
||||
return SpecSchema(**spec)
|
||||
|
||||
def generate(
|
||||
self, res, target_dir, openapi_spec=None, operation_id=None, args=None
|
||||
):
|
||||
"""Generate Json Schema definition file for Resource"""
|
||||
logging.debug("Generating OpenAPI schema data")
|
||||
# We do not import generators since due to the use of Singletons in the
|
||||
# code importing glance, nova, cinder at the same time crashes
|
||||
# dramatically
|
||||
spec_path = Path(args.openapi_yaml_spec)
|
||||
metadata_path = Path(target_dir, args.service_type + "_metadata.yaml")
|
||||
|
||||
schema = self.load_openapi(spec_path)
|
||||
openapi_spec = common.get_openapi_spec(spec_path)
|
||||
metadata = self.build_metadata(
|
||||
schema, openapi_spec, args.service_type, spec_path.as_posix()
|
||||
)
|
||||
|
||||
yaml = YAML()
|
||||
yaml.preserve_quotes = True
|
||||
yaml.default_flow_style = False
|
||||
yaml.indent(mapping=2, sequence=4, offset=2)
|
||||
metadata_path.parent.mkdir(exist_ok=True, parents=True)
|
||||
with open(metadata_path, "w") as fp:
|
||||
yaml.dump(
|
||||
metadata.model_dump(
|
||||
exclude_none=True, exclude_defaults=True, by_alias=True
|
||||
),
|
||||
fp,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def build_metadata(
|
||||
schema, openapi_spec, service_type: str, spec_path: str
|
||||
) -> Metadata:
|
||||
metadata = Metadata(resources={})
|
||||
api_ver = "v" + schema.info["version"].split(".")[0]
|
||||
service_metadata: ty.Type[MetadataBase] = SERVICE_METADATA_MAP[
|
||||
service_type
|
||||
]
|
||||
|
||||
for path, spec in schema.paths.items():
|
||||
path_elements: list[str] = path.split("/")
|
||||
resource_name = "/".join(
|
||||
list(common.get_resource_names_from_url(path))
|
||||
)
|
||||
if service_type == "object-store":
|
||||
if path == "/v1/{account}":
|
||||
resource_name = "account"
|
||||
elif path == "/v1/{account}/{container}":
|
||||
resource_name = "container"
|
||||
if path == "/v1/{account}/{object}":
|
||||
resource_name = "object"
|
||||
|
||||
if service_type == "compute" and resource_name in [
|
||||
"agent",
|
||||
"baremetal_node",
|
||||
"cell",
|
||||
"cell/capacity",
|
||||
"cell/info",
|
||||
"cell/sync_instance",
|
||||
"certificate",
|
||||
"cloudpipe",
|
||||
"fping",
|
||||
"fixed_ip",
|
||||
"floating_ip_dns",
|
||||
"floating_ip_dns/entry",
|
||||
"floating_ip_pool",
|
||||
"floating_ip_bulk",
|
||||
"host",
|
||||
"host/reboot",
|
||||
"host/shutdown",
|
||||
"host/startup",
|
||||
"image",
|
||||
"image/metadata",
|
||||
"network",
|
||||
"security_group_default_rule",
|
||||
"security_group_rule",
|
||||
"security_group",
|
||||
"server/console",
|
||||
"server/virtual_interface",
|
||||
"snapshot",
|
||||
"tenant_network",
|
||||
"volume",
|
||||
"volumes_boot",
|
||||
]:
|
||||
# We do not need to produce anything for deprecated APIs
|
||||
continue
|
||||
resource_model = metadata.resources.setdefault(
|
||||
f"{service_type}.{resource_name}",
|
||||
ResourceModel(
|
||||
api_version=api_ver, spec_file=spec_path, operations={}
|
||||
),
|
||||
)
|
||||
for method in [
|
||||
"head",
|
||||
"get",
|
||||
"put",
|
||||
"post",
|
||||
"delete",
|
||||
"options",
|
||||
"patch",
|
||||
]:
|
||||
operation = getattr(spec, method, None)
|
||||
if operation:
|
||||
if not operation.operationId:
|
||||
# Every operation must have operationId
|
||||
continue
|
||||
if operation.operationId in OPERATION_ID_BLACKLIST:
|
||||
# For blacklisted operationIds were are not producing anything
|
||||
continue
|
||||
|
||||
op_model = OperationModel(
|
||||
operation_id=operation.operationId, targets={}
|
||||
)
|
||||
operation_key: str | None = None
|
||||
|
||||
response_schema: dict | None = None
|
||||
for code, rsp in operation.responses.items():
|
||||
if code.startswith("2"):
|
||||
response_schema = (
|
||||
rsp.get("content", {})
|
||||
.get("application/json", {})
|
||||
.get("schema", {})
|
||||
)
|
||||
break
|
||||
# Try to get overrides from service metadata
|
||||
operation_key, skip = service_metadata.get_operation_key(
|
||||
operation, path, method, resource_name
|
||||
)
|
||||
if skip:
|
||||
continue
|
||||
logging.debug(
|
||||
f"Got {operation_key} as a key for {operation.operationId} as an override from service metadata processor"
|
||||
)
|
||||
|
||||
if not operation_key:
|
||||
if path.endswith("}"):
|
||||
if method == "get":
|
||||
operation_key = "show"
|
||||
elif method == "head":
|
||||
operation_key = "check"
|
||||
elif method == "put":
|
||||
operation_key = "update"
|
||||
elif method == "patch":
|
||||
if (
|
||||
"application/json"
|
||||
in operation.requestBody.get("content", {})
|
||||
):
|
||||
operation_key = "update"
|
||||
else:
|
||||
operation_key = "patch"
|
||||
elif method == "post":
|
||||
operation_key = "create"
|
||||
elif method == "delete":
|
||||
operation_key = "delete"
|
||||
elif (
|
||||
path.endswith("/detail")
|
||||
and resource_name != "quota_set"
|
||||
):
|
||||
if method == "get":
|
||||
operation_key = "list_detailed"
|
||||
elif response_schema and (
|
||||
method == "get"
|
||||
and (
|
||||
response_schema.get("type", "") == "array"
|
||||
or (
|
||||
response_schema.get("type", "") == "object"
|
||||
and "properties" in response_schema
|
||||
and len(path_elements) > 1
|
||||
and path_elements[-1]
|
||||
in response_schema.get("properties", {})
|
||||
and response_schema.get("properties", {})
|
||||
.get(path_elements[-1], {})
|
||||
.get("type")
|
||||
== "array"
|
||||
)
|
||||
)
|
||||
):
|
||||
# Response looks clearly like a list
|
||||
operation_key = "list"
|
||||
elif path.endswith("/action"):
|
||||
# Action
|
||||
operation_key = "action"
|
||||
elif (
|
||||
len(
|
||||
[
|
||||
x
|
||||
for x in schema.paths.keys()
|
||||
if x.startswith(path + "/{")
|
||||
]
|
||||
)
|
||||
> 0
|
||||
):
|
||||
# if we are at i.e. /v2/servers and there is
|
||||
# /v2/servers/{ most likely we are at the collection
|
||||
# level
|
||||
if method == "get":
|
||||
operation_key = "list"
|
||||
elif method == "head":
|
||||
operation_key = "check"
|
||||
elif method == "patch":
|
||||
if (
|
||||
"application/json"
|
||||
in operation.requestBody.get("content", {})
|
||||
):
|
||||
operation_key = "update"
|
||||
else:
|
||||
operation_key = "patch"
|
||||
elif method == "post":
|
||||
operation_key = "create"
|
||||
elif method == "put":
|
||||
operation_key = "replace"
|
||||
elif method == "delete":
|
||||
operation_key = "delete_all"
|
||||
elif method == "head":
|
||||
operation_key = "check"
|
||||
elif method == "get":
|
||||
operation_key = "get"
|
||||
elif method == "post":
|
||||
operation_key = "create"
|
||||
elif method == "put":
|
||||
operation_key = path.split("/")[-1]
|
||||
elif method == "patch":
|
||||
if "application/json" in operation.requestBody.get(
|
||||
"content", {}
|
||||
):
|
||||
operation_key = "update"
|
||||
else:
|
||||
operation_key = "patch"
|
||||
elif method == "delete":
|
||||
operation_key = "delete"
|
||||
if not operation_key:
|
||||
logging.warning(
|
||||
f"Cannot identify op name for {path}:{method}"
|
||||
)
|
||||
|
||||
if operation_key in resource_model:
|
||||
raise RuntimeError("Operation name conflict")
|
||||
else:
|
||||
if operation_key == "action" and service_type in [
|
||||
"compute",
|
||||
"block-storage",
|
||||
"shared-file-system",
|
||||
]:
|
||||
# For action we actually have multiple independent operations
|
||||
try:
|
||||
body_schema = operation.requestBody["content"][
|
||||
"application/json"
|
||||
]["schema"]
|
||||
bodies = body_schema.get(
|
||||
"oneOf", [body_schema]
|
||||
)
|
||||
if len(bodies) > 1:
|
||||
discriminator = body_schema.get(
|
||||
"x-openstack", {}
|
||||
).get("discriminator")
|
||||
if discriminator != "action":
|
||||
raise RuntimeError(
|
||||
f"Cannot generate metadata for {path} since request body is not having action discriminator"
|
||||
)
|
||||
for body in bodies:
|
||||
action_name = body.get(
|
||||
"x-openstack", {}
|
||||
).get("action-name")
|
||||
if not action_name:
|
||||
action_name = list(
|
||||
body["properties"].keys()
|
||||
)[0]
|
||||
# Hardcode fixes
|
||||
if (
|
||||
resource_name == "flavor"
|
||||
and action_name
|
||||
in ["update", "create", "delete"]
|
||||
):
|
||||
# Flavor update/create/delete
|
||||
# operations are exposed ALSO as wsgi
|
||||
# actions. This is wrong and useless.
|
||||
logging.warning(
|
||||
"Skipping generating %s:%s action",
|
||||
resource_name,
|
||||
action_name,
|
||||
)
|
||||
continue
|
||||
|
||||
operation_name = "-".join(
|
||||
x.lower()
|
||||
for x in re.split(
|
||||
common.SPLIT_NAME_RE, action_name
|
||||
)
|
||||
).lower()
|
||||
rust_sdk_params = (
|
||||
get_rust_sdk_operation_args(
|
||||
"action",
|
||||
operation_name=action_name,
|
||||
module_name=get_module_name(
|
||||
action_name
|
||||
),
|
||||
)
|
||||
)
|
||||
rust_cli_params = (
|
||||
get_rust_cli_operation_args(
|
||||
"action",
|
||||
operation_name=action_name,
|
||||
module_name=get_module_name(
|
||||
action_name
|
||||
),
|
||||
resource_name=resource_name,
|
||||
)
|
||||
)
|
||||
|
||||
op_model = OperationModel(
|
||||
operation_id=operation.operationId,
|
||||
targets={},
|
||||
)
|
||||
op_model.operation_type = "action"
|
||||
|
||||
op_model.targets["rust-sdk"] = (
|
||||
rust_sdk_params
|
||||
)
|
||||
op_model.targets["rust-cli"] = (
|
||||
rust_cli_params
|
||||
)
|
||||
|
||||
op_model = post_process_operation(
|
||||
service_type,
|
||||
resource_name,
|
||||
operation_name,
|
||||
op_model,
|
||||
)
|
||||
|
||||
resource_model.operations[
|
||||
operation_name
|
||||
] = op_model
|
||||
|
||||
except KeyError:
|
||||
raise RuntimeError(
|
||||
f"Cannot get bodies for {path}"
|
||||
)
|
||||
else:
|
||||
if not operation_key:
|
||||
raise NotImplementedError
|
||||
operation_type = get_operation_type_by_key(
|
||||
operation_key
|
||||
)
|
||||
op_model.operation_type = operation_type
|
||||
# NOTE: sdk gets operation_key and not operation_type
|
||||
rust_sdk_params = get_rust_sdk_operation_args(
|
||||
operation_key
|
||||
)
|
||||
rust_cli_params = get_rust_cli_operation_args(
|
||||
operation_key, resource_name=resource_name
|
||||
)
|
||||
|
||||
op_model.targets["rust-sdk"] = rust_sdk_params
|
||||
if rust_cli_params and not (
|
||||
service_type == "identity"
|
||||
and operation_key == "check"
|
||||
):
|
||||
op_model.targets["rust-cli"] = rust_cli_params
|
||||
|
||||
op_model = post_process_operation(
|
||||
service_type,
|
||||
resource_name,
|
||||
operation_key,
|
||||
op_model,
|
||||
)
|
||||
|
||||
resource_model.operations[operation_key] = op_model
|
||||
for res_name, res_data in metadata.resources.items():
|
||||
# Sanitize produced metadata
|
||||
list_op = res_data.operations.get("list")
|
||||
list_detailed_op = res_data.operations.get("list_detailed")
|
||||
if list_op and list_detailed_op:
|
||||
# There are both plain list and list with details operation.
|
||||
# For the certain generator backend it makes no sense to have
|
||||
# then both so we should disable generation of certain backends
|
||||
# for the non detailed endpoint
|
||||
list_op.targets.pop("rust-cli")
|
||||
|
||||
# Prepare `find` operation data
|
||||
if (list_op or list_detailed_op) and res_data.operations.get(
|
||||
"show"
|
||||
):
|
||||
show_op = res_data.operations["show"]
|
||||
|
||||
(path, _, spec) = common.find_openapi_operation(
|
||||
openapi_spec, show_op.operation_id
|
||||
)
|
||||
mod_path = common.get_rust_sdk_mod_path(
|
||||
service_type, res_data.api_version or "", path
|
||||
)
|
||||
response_schema = None
|
||||
for code, rspec in spec.get("responses", {}).items():
|
||||
if not code.startswith("2"):
|
||||
continue
|
||||
content = rspec.get("content", {})
|
||||
if "application/json" in content:
|
||||
try:
|
||||
(response_schema, _) = common.find_resource_schema(
|
||||
content["application/json"].get("schema", {}),
|
||||
None,
|
||||
)
|
||||
except Exception as ex:
|
||||
logging.exception(
|
||||
"Cannot process response of %s operation: %s",
|
||||
show_op.operation_id,
|
||||
ex,
|
||||
)
|
||||
|
||||
if not response_schema:
|
||||
# Show does not have a suitable
|
||||
# response. We can't have find
|
||||
# for such
|
||||
continue
|
||||
if "id" not in response_schema.get("properties", {}).keys():
|
||||
# Resource has no ID in show method => find impossible
|
||||
continue
|
||||
elif (
|
||||
"name" not in response_schema.get("properties", {}).keys()
|
||||
and res_name != "floatingip"
|
||||
):
|
||||
# Resource has no NAME => find useless
|
||||
continue
|
||||
|
||||
list_op_ = list_detailed_op or list_op
|
||||
if not list_op_:
|
||||
continue
|
||||
(_, _, list_spec) = common.find_openapi_operation(
|
||||
openapi_spec, list_op_.operation_id
|
||||
)
|
||||
name_field: str = "name"
|
||||
for fqan, alias in common.FQAN_ALIAS_MAP.items():
|
||||
if fqan.startswith(res_name) and alias == "name":
|
||||
name_field = fqan.split(".")[-1]
|
||||
name_filter_supported: bool = False
|
||||
if name_field in [
|
||||
x.get("name")
|
||||
for x in list(list_spec.get("parameters", []))
|
||||
]:
|
||||
name_filter_supported = True
|
||||
|
||||
sdk_params = OperationTargetParams(
|
||||
module_name="find",
|
||||
name_field=name_field,
|
||||
name_filter_supported=name_filter_supported,
|
||||
sdk_mod_path="::".join(mod_path),
|
||||
list_mod="list_detailed" if list_detailed_op else "list",
|
||||
)
|
||||
res_data.operations["find"] = OperationModel(
|
||||
operation_id=list_op_.operation_id,
|
||||
operation_type="find",
|
||||
targets={"rust-sdk": sdk_params},
|
||||
)
|
||||
|
||||
# Let other operations know of `find` presence
|
||||
for op_name, op_data in res_data.operations.items():
|
||||
if op_name not in ["find", "list", "create"]:
|
||||
for (
|
||||
target_name,
|
||||
target_params,
|
||||
) in op_data.targets.items():
|
||||
if target_name in ["rust-cli"]:
|
||||
target_params.find_implemented_by_sdk = True
|
||||
|
||||
return metadata
|
||||
|
||||
|
||||
def get_operation_type_by_key(operation_key):
|
||||
if operation_key in ["list", "list_detailed"]:
|
||||
return "list"
|
||||
elif operation_key in ["get", "stats", "status"]:
|
||||
return "get"
|
||||
elif operation_key == "check":
|
||||
return "get"
|
||||
elif operation_key == "show":
|
||||
return "show"
|
||||
elif operation_key in ["update", "replace"]:
|
||||
return "set"
|
||||
elif operation_key in ["delete", "delete_all"]:
|
||||
return "delete"
|
||||
elif operation_key in ["create"]:
|
||||
return "create"
|
||||
elif operation_key == "patch":
|
||||
return "set"
|
||||
elif operation_key == "default":
|
||||
return "show"
|
||||
elif operation_key == "defaults":
|
||||
return "show"
|
||||
elif operation_key == "details":
|
||||
return "show"
|
||||
elif operation_key == "download":
|
||||
return "download"
|
||||
elif operation_key == "upload":
|
||||
return "upload"
|
||||
elif operation_key in ["associate", "disassociate", "disassociate_all"]:
|
||||
# Cinder XXXssociate are GET actions not accepting body - crazy
|
||||
return "get"
|
||||
else:
|
||||
return "action"
|
||||
|
||||
|
||||
def get_rust_sdk_operation_args(
|
||||
operation_key: str,
|
||||
operation_name: str | None = None,
|
||||
module_name: str | None = None,
|
||||
):
|
||||
"""Construct proper Rust SDK parameters for operation by type"""
|
||||
sdk_params = OperationTargetParams()
|
||||
sdk_params.module_name = module_name
|
||||
if operation_key == "show":
|
||||
sdk_params.module_name = "get"
|
||||
elif operation_key == "list_detailed":
|
||||
sdk_params.module_name = "list_detailed"
|
||||
# elif operation_key == "action" and not module_name:
|
||||
# sdk_params.module_name = operation_name if operation_name else operation_key
|
||||
else:
|
||||
sdk_params.module_name = module_name or get_module_name(
|
||||
# get_operation_type_by_key(operation_key)
|
||||
operation_key
|
||||
)
|
||||
sdk_params.operation_name = operation_name
|
||||
|
||||
return sdk_params
|
||||
|
||||
|
||||
def get_rust_cli_operation_args(
|
||||
operation_key: str,
|
||||
operation_name: str | None = None,
|
||||
module_name: str | None = None,
|
||||
resource_name: str | None = None,
|
||||
):
|
||||
"""Construct proper Rust CLI parameters for operation by type"""
|
||||
# Get SDK params to connect things with each other
|
||||
# operation_type = get_operation_type_by_key(operation_key)
|
||||
sdk_params = get_rust_sdk_operation_args(
|
||||
operation_key, operation_name=operation_name, module_name=module_name
|
||||
)
|
||||
cli_params = OperationTargetParams()
|
||||
cli_params.sdk_mod_name = sdk_params.module_name
|
||||
cli_params.module_name = module_name or get_module_name(operation_key)
|
||||
cli_params.operation_name = operation_name
|
||||
if resource_name:
|
||||
op_name = cli_params.module_name
|
||||
if op_name.startswith("os_") or op_name.startswith("os-"):
|
||||
op_name = op_name[3:]
|
||||
op_name = op_name.replace("_", "-")
|
||||
|
||||
cli_params.cli_full_command = (
|
||||
" ".join(x for x in resource_name.split("/")).replace("_", "-")
|
||||
+ " "
|
||||
+ op_name
|
||||
)
|
||||
|
||||
return cli_params
|
||||
|
||||
|
||||
def get_module_name(name):
|
||||
if name in ["list", "list_detailed"]:
|
||||
return "list"
|
||||
elif name == "get":
|
||||
return "get"
|
||||
elif name == "show":
|
||||
return "show"
|
||||
elif name == "check":
|
||||
return "head"
|
||||
elif name == "update":
|
||||
return "set"
|
||||
elif name == "replace":
|
||||
return "replace"
|
||||
elif name == "delete":
|
||||
return "delete"
|
||||
elif name == "delete_all":
|
||||
return "delete_all"
|
||||
elif name in ["create"]:
|
||||
return "create"
|
||||
elif name in ["default"]:
|
||||
return "default"
|
||||
return "_".join(x.lower() for x in re.split(common.SPLIT_NAME_RE, name))
|
||||
|
||||
|
||||
def post_process_operation(
|
||||
service_type: str, resource_name: str, operation_name: str, operation
|
||||
):
|
||||
service_metadata = SERVICE_METADATA_MAP[service_type]
|
||||
operation = service_metadata.post_process_operation(
|
||||
resource_name, operation_name, operation
|
||||
)
|
||||
|
||||
return operation
|
33
codegenerator/metadata/baremetal.py
Normal file
33
codegenerator/metadata/baremetal.py
Normal file
@ -0,0 +1,33 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class BaremetalMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
return operation
|
31
codegenerator/metadata/base.py
Normal file
31
codegenerator/metadata/base.py
Normal file
@ -0,0 +1,31 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
|
||||
|
||||
class MetadataBase(ABC):
|
||||
@staticmethod
|
||||
@abstractmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]: ...
|
||||
|
||||
@staticmethod
|
||||
@abstractmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation: OperationModel
|
||||
) -> OperationModel: ...
|
135
codegenerator/metadata/block_storage.py
Normal file
135
codegenerator/metadata/block_storage.py
Normal file
@ -0,0 +1,135 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class BlockStorageMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
path_elements: list[str] = path.split("/")
|
||||
|
||||
if "volume-transfer" in path and path.endswith("/accept"):
|
||||
operation_key = "accept"
|
||||
elif "qos-specs" in path and path_elements[-1] in [
|
||||
"associate",
|
||||
"disassociate",
|
||||
"disassociate_all",
|
||||
"delete_keys",
|
||||
]:
|
||||
operation_key = path_elements[-1]
|
||||
elif resource_name == "quota_set" and path.endswith("defaults"):
|
||||
operation_key = "defaults"
|
||||
|
||||
elif resource_name == "limit" and method == "get":
|
||||
operation_key = "list"
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
if resource_name == "type":
|
||||
if operation_name == "list":
|
||||
operation.targets["rust-cli"].response_key = "volume_types"
|
||||
operation.targets["rust-sdk"].response_key = "volume_types"
|
||||
elif operation_name in ["create", "show", "update"]:
|
||||
operation.targets["rust-cli"].response_key = "volume_type"
|
||||
operation.targets["rust-sdk"].response_key = "volume_type"
|
||||
elif resource_name == "type/volume_type_access":
|
||||
operation.targets["rust-cli"].response_key = "volume_type_access"
|
||||
operation.targets["rust-sdk"].response_key = "volume_type_access"
|
||||
|
||||
if "/tag" in resource_name:
|
||||
if operation_name == "update":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("set", "add")
|
||||
elif operation_name == "show":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("show", "check")
|
||||
|
||||
if resource_name == "snapshot":
|
||||
if "update-snapshot-status" in operation_name:
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace(
|
||||
"update-snapshot-status", "update-status"
|
||||
)
|
||||
|
||||
if resource_name in ["os_volume_transfer", "volume_transfer"]:
|
||||
if operation_name in ["list", "list_detailed"]:
|
||||
operation.targets["rust-cli"].response_key = "transfers"
|
||||
operation.targets["rust-sdk"].response_key = "transfers"
|
||||
elif operation_name in ["accept", "create", "show"]:
|
||||
operation.targets["rust-cli"].response_key = "transfer"
|
||||
|
||||
if resource_name == "availability_zone":
|
||||
if operation_name == "get":
|
||||
operation.operation_type = "list"
|
||||
operation.targets["rust-sdk"].operation_name = "list"
|
||||
operation.targets[
|
||||
"rust-sdk"
|
||||
].response_key = "availabilityZoneInfo"
|
||||
operation.targets["rust-sdk"].module_name = "list"
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].response_key = "availabilityZoneInfo"
|
||||
operation.targets["rust-cli"].module_name = "list"
|
||||
operation.targets["rust-cli"].sdk_mod_name = "list"
|
||||
operation.targets["rust-cli"].operation_name = "list"
|
||||
operation.targets[
|
||||
"rust-sdk"
|
||||
].response_key = "availabilityZoneInfo"
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "availability-zone list"
|
||||
if resource_name == "qos_spec/association":
|
||||
operation.operation_type = "list"
|
||||
operation.targets["rust-sdk"].operation_name = "list"
|
||||
operation.targets["rust-sdk"].module_name = "list"
|
||||
operation.targets["rust-cli"].operation_name = "list"
|
||||
operation.targets["rust-cli"].module_name = "list"
|
||||
operation.targets["rust-cli"].sdk_mod_name = "list"
|
||||
operation.targets["rust-sdk"].response_key = "qos_associations"
|
||||
operation.targets["rust-cli"].response_key = "qos_associations"
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "qos-spec association list"
|
||||
|
||||
if resource_name == "limit":
|
||||
# Limits API return object and not a list
|
||||
operation.targets["rust-cli"].operation_type = "show"
|
||||
operation.targets["rust-cli"].response_key = "limits"
|
||||
operation.targets["rust-sdk"].response_key = "limits"
|
||||
|
||||
if operation_name == "delete_all":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("delete-all", "purge")
|
||||
|
||||
return operation
|
195
codegenerator/metadata/compute.py
Normal file
195
codegenerator/metadata/compute.py
Normal file
@ -0,0 +1,195 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class ComputeMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
path_elements: list[str] = path.split("/")
|
||||
|
||||
if resource_name == "flavor/flavor_access" and method == "get":
|
||||
operation_key = "list"
|
||||
elif resource_name == "aggregate/image" and method == "post":
|
||||
operation_key = "action"
|
||||
elif resource_name == "server/security_group" and method == "get":
|
||||
operation_key = "list"
|
||||
elif resource_name == "server/topology" and method == "get":
|
||||
operation_key = "list"
|
||||
elif resource_name == "quota_set" and path.endswith("defaults"):
|
||||
operation_key = "defaults"
|
||||
elif resource_name == "quota_set" and path.endswith("detail"):
|
||||
# normalize "details" name
|
||||
operation_key = "details"
|
||||
|
||||
elif resource_name == "limit" and method == "get":
|
||||
operation_key = "list"
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
if resource_name == "aggregate":
|
||||
if operation_name in ["set-metadata", "add-host", "remove-host"]:
|
||||
operation.targets["rust-sdk"].response_key = "aggregate"
|
||||
operation.targets["rust-cli"].response_key = "aggregate"
|
||||
elif resource_name == "availability_zone":
|
||||
if operation_name == "get":
|
||||
operation.operation_type = "list"
|
||||
operation.targets["rust-sdk"].operation_name = "list"
|
||||
operation.targets[
|
||||
"rust-sdk"
|
||||
].response_key = "availabilityZoneInfo"
|
||||
operation.targets["rust-sdk"].module_name = "list"
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].response_key = "availabilityZoneInfo"
|
||||
operation.targets["rust-cli"].module_name = "list"
|
||||
operation.targets["rust-cli"].sdk_mod_name = "list"
|
||||
operation.targets["rust-cli"].operation_name = "list"
|
||||
operation.targets[
|
||||
"rust-sdk"
|
||||
].response_key = "availabilityZoneInfo"
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "availability-zone list"
|
||||
elif operation_name == "list_detailed":
|
||||
operation.operation_type = "list"
|
||||
operation.targets["rust-sdk"].operation_name = "list_detail"
|
||||
operation.targets[
|
||||
"rust-sdk"
|
||||
].response_key = "availabilityZoneInfo"
|
||||
operation.targets["rust-sdk"].module_name = "list_detail"
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].response_key = "availabilityZoneInfo"
|
||||
operation.targets["rust-cli"].operation_name = "list"
|
||||
operation.targets["rust-cli"].module_name = "list_detail"
|
||||
operation.targets["rust-cli"].sdk_mod_name = "list_detail"
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "availability-zone list-detail"
|
||||
|
||||
elif resource_name == "keypair":
|
||||
if operation_name == "list":
|
||||
operation.targets[
|
||||
"rust-sdk"
|
||||
].response_list_item_key = "keypair"
|
||||
|
||||
elif resource_name == "server":
|
||||
if "migrate-live" in operation_name:
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("migrate-live", "live-migrate")
|
||||
elif resource_name == "server/instance_action":
|
||||
if operation_name == "list":
|
||||
operation.targets["rust-sdk"].response_key = "instanceActions"
|
||||
operation.targets["rust-cli"].response_key = "instanceActions"
|
||||
else:
|
||||
operation.targets["rust-sdk"].response_key = "instanceAction"
|
||||
operation.targets["rust-cli"].response_key = "instanceAction"
|
||||
elif resource_name == "server/topology":
|
||||
if operation_name == "list":
|
||||
operation.targets["rust-sdk"].response_key = "nodes"
|
||||
operation.targets["rust-cli"].response_key = "nodes"
|
||||
elif resource_name == "server/volume_attachment":
|
||||
if operation_name == "list":
|
||||
operation.targets[
|
||||
"rust-sdk"
|
||||
].response_key = "volumeAttachments"
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].response_key = "volumeAttachments"
|
||||
elif operation_name in ["create", "show", "update"]:
|
||||
operation.targets["rust-sdk"].response_key = "volumeAttachment"
|
||||
operation.targets["rust-cli"].response_key = "volumeAttachment"
|
||||
elif resource_name == "server/server_password":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("server-password", "password")
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("get", "show")
|
||||
elif resource_name == "server/security_group":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace(
|
||||
"security-group list", "security-groups"
|
||||
)
|
||||
if operation_name == "get":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("get", "show")
|
||||
|
||||
elif resource_name == "flavor":
|
||||
if operation_name == "add-tenant-access":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("add-tenant-access", "access add")
|
||||
elif operation_name == "list-tenant-access":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("list-tenant-access", "access list")
|
||||
elif operation_name == "remove-tenant-access":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace(
|
||||
"remove-tenant-access", "access remove"
|
||||
)
|
||||
|
||||
if resource_name == "limit":
|
||||
# Limits API return object and not a list
|
||||
operation.targets["rust-cli"].operation_type = "show"
|
||||
operation.targets["rust-cli"].response_key = "limits"
|
||||
operation.targets["rust-sdk"].response_key = "limits"
|
||||
|
||||
if "/tag" in resource_name:
|
||||
if operation_name == "update":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("set", "add")
|
||||
elif operation_name == "show":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("show", "check")
|
||||
|
||||
if operation_name == "delete_all":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("delete-all", "purge")
|
||||
|
||||
return operation
|
48
codegenerator/metadata/dns.py
Normal file
48
codegenerator/metadata/dns.py
Normal file
@ -0,0 +1,48 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class DnsMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
path_elements: list[str] = path.split("/")
|
||||
|
||||
if resource_name == "zone/task":
|
||||
if path == "/v2/zones/{zone_id}/tasks/xfr":
|
||||
operation_key = "xfr"
|
||||
if path == "/v2/zones/{zone_id}/tasks/abandon":
|
||||
operation_key = "abandon"
|
||||
if path == "/v2/zones/{zone_id}/tasks/pool_move":
|
||||
operation_key = "pool_move"
|
||||
elif resource_name == "quota" and path == "/v2/quotas":
|
||||
# /quotas return quota for current project and not
|
||||
# a "list" for all projects. As such it has no
|
||||
# difference to show
|
||||
skip = True
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
return operation
|
143
codegenerator/metadata/identity.py
Normal file
143
codegenerator/metadata/identity.py
Normal file
@ -0,0 +1,143 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class IdentityMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
|
||||
if path == "/v3/users/{user_id}/password":
|
||||
if method == "post":
|
||||
operation_key = "update"
|
||||
|
||||
if resource_name in [
|
||||
"OS_FEDERATION/identity_provider",
|
||||
"OS_FEDERATION/identity_provider/protocol",
|
||||
"OS_FEDERATION/mapping",
|
||||
"OS_FEDERATION/service_provider",
|
||||
]:
|
||||
if method == "put":
|
||||
operation_key = "create"
|
||||
elif method == "patch":
|
||||
operation_key = "update"
|
||||
if (
|
||||
resource_name
|
||||
in [
|
||||
"domain/config",
|
||||
"domain/config/group",
|
||||
"domain/config/group/option",
|
||||
]
|
||||
and path.endswith("/default")
|
||||
and method == "get"
|
||||
):
|
||||
operation_key = "default"
|
||||
|
||||
if (
|
||||
resource_name
|
||||
in [
|
||||
"domain/config",
|
||||
"domain/config/group",
|
||||
"domain/config/group/option",
|
||||
]
|
||||
and path.endswith("/default")
|
||||
and method == "head"
|
||||
):
|
||||
# No need in HEAD defaults
|
||||
skip = True
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
if resource_name == "role/imply":
|
||||
if operation_name == "list":
|
||||
operation.targets["rust-cli"].response_key = "role_inference"
|
||||
operation.targets["rust-sdk"].response_key = "role_inference"
|
||||
if resource_name == "role_inference":
|
||||
if operation_name == "list":
|
||||
operation.targets["rust-cli"].response_key = "role_inferences"
|
||||
operation.targets["rust-sdk"].response_key = "role_inferences"
|
||||
|
||||
if resource_name == "domain/config/group":
|
||||
operation.targets["rust-sdk"].response_key = "config"
|
||||
if "rust-cli" in operation.targets:
|
||||
operation.targets["rust-cli"].response_key = "config"
|
||||
elif resource_name == "domain/config/group/option":
|
||||
operation.targets["rust-sdk"].response_key = "config"
|
||||
if "rust-cli" in operation.targets:
|
||||
operation.targets["rust-cli"].response_key = "config"
|
||||
|
||||
if "rust-cli" in operation.targets:
|
||||
if "OS_FEDERATION" in resource_name:
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("OS-FEDERATION", "federation")
|
||||
if "OS_EP_FILTER" in resource_name:
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("OS-EP-FILTER", "endpoint-filter")
|
||||
elif resource_name == "user/project":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "user projects"
|
||||
elif resource_name == "user/group":
|
||||
operation.targets["rust-cli"].cli_full_command = "user groups"
|
||||
elif resource_name == "user/access_rule":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("user access-rule", "access-rule")
|
||||
elif resource_name == "user/application_credential":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace(
|
||||
"user application-credential", "application-credential"
|
||||
)
|
||||
|
||||
if "/tag" in resource_name:
|
||||
if operation_name == "update":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("set", "add")
|
||||
elif operation_name == "show":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("show", "check")
|
||||
|
||||
if operation_name == "delete_all":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("delete-all", "purge")
|
||||
|
||||
return operation
|
106
codegenerator/metadata/image.py
Normal file
106
codegenerator/metadata/image.py
Normal file
@ -0,0 +1,106 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class ImageMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
path_elements: list[str] = path.split("/")
|
||||
|
||||
if path == "/v2/images/{image_id}/file":
|
||||
if method == "put":
|
||||
operation_key = "upload"
|
||||
elif method == "get":
|
||||
operation_key = "download"
|
||||
else:
|
||||
raise NotImplementedError
|
||||
elif path.endswith("/actions/deactivate"):
|
||||
operation_key = "deactivate"
|
||||
elif path.endswith("/actions/reactivate"):
|
||||
operation_key = "reactivate"
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
if resource_name.startswith("schema"):
|
||||
# Image schemas are a JSON operation
|
||||
operation.targets["rust-cli"].operation_type = "json"
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("get", "show")
|
||||
elif resource_name == "metadef/namespace" and operation_name != "list":
|
||||
operation.targets["rust-sdk"].response_key = "null"
|
||||
operation.targets["rust-cli"].response_key = "null"
|
||||
elif (
|
||||
resource_name == "metadef/namespace/property"
|
||||
and operation_name == "list"
|
||||
):
|
||||
operation.targets["rust-cli"].operation_type = "list_from_struct"
|
||||
operation.targets["rust-cli"].response_key = "properties"
|
||||
operation.targets["rust-sdk"].response_key = "properties"
|
||||
elif resource_name == "metadef/namespace/resource_type":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].response_key = "resource_type_associations"
|
||||
operation.targets[
|
||||
"rust-sdk"
|
||||
].response_key = "resource_type_associations"
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace(
|
||||
"resource-type", "resource-type-association"
|
||||
)
|
||||
elif resource_name == "image":
|
||||
if operation_name == "patch":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("patch", "set")
|
||||
elif resource_name == "image/file":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("file ", "")
|
||||
|
||||
if "/tag" in resource_name:
|
||||
if operation_name == "update":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("set", "add")
|
||||
elif operation_name == "show":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("show", "check")
|
||||
|
||||
if operation_name == "delete_all":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("delete-all", "purge")
|
||||
|
||||
return operation
|
43
codegenerator/metadata/load_balancer.py
Normal file
43
codegenerator/metadata/load_balancer.py
Normal file
@ -0,0 +1,43 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class LoadBalancerMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
path_elements: list[str] = path.split("/")
|
||||
|
||||
if len(path_elements) > 1 and path_elements[-1] in [
|
||||
"stats",
|
||||
"status",
|
||||
"failover",
|
||||
"config",
|
||||
]:
|
||||
operation_key = path_elements[-1]
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
return operation
|
89
codegenerator/metadata/network.py
Normal file
89
codegenerator/metadata/network.py
Normal file
@ -0,0 +1,89 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class NetworkMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
path_elements: list[str] = path.split("/")
|
||||
|
||||
if "quota" in path and path.endswith("/default"):
|
||||
# normalize "defaults" name
|
||||
operation_key = "defaults"
|
||||
elif "quota" in path and path.endswith("/details"):
|
||||
operation_key = "details"
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
if resource_name.startswith("floatingip"):
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("floatingip", "floating-ip")
|
||||
|
||||
if resource_name == "router":
|
||||
if "external_gateways" in operation_name:
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace(
|
||||
"external-gateways", "external-gateway"
|
||||
)
|
||||
elif "extraroutes" in operation_name:
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("extraroutes", "extraroute")
|
||||
|
||||
if resource_name == "address_group":
|
||||
if "addresses" in operation_name:
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("addresses", "address")
|
||||
|
||||
if "/tag" in resource_name:
|
||||
if operation_name == "update":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("set", "add")
|
||||
elif operation_name == "show":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("show", "check")
|
||||
|
||||
if operation_name == "delete_all":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("delete-all", "purge")
|
||||
|
||||
return operation
|
91
codegenerator/metadata/object_store.py
Normal file
91
codegenerator/metadata/object_store.py
Normal file
@ -0,0 +1,91 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class ObjectStorageMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
path_elements: list[str] = path.split("/")
|
||||
|
||||
if resource_name == "object":
|
||||
mapping_obj: dict[str, str] = {
|
||||
"head": "head",
|
||||
"get": "get",
|
||||
"delete": "delete",
|
||||
"put": "put",
|
||||
"post": "update",
|
||||
}
|
||||
operation_key = mapping_obj[method]
|
||||
elif resource_name == "container":
|
||||
mapping_cont: dict[str, str] = {
|
||||
"head": "head",
|
||||
"get": "get",
|
||||
"delete": "delete",
|
||||
"put": "create",
|
||||
"post": "update",
|
||||
}
|
||||
operation_key = mapping_cont[method]
|
||||
elif resource_name == "account":
|
||||
mapping_account: dict[str, str] = {
|
||||
"head": "head",
|
||||
"get": "get",
|
||||
"delete": "delete",
|
||||
"put": "create",
|
||||
"post": "update",
|
||||
}
|
||||
operation_key = mapping_account[method]
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
if resource_name == "account":
|
||||
if operation_name == "get":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "container list"
|
||||
elif operation_name == "head":
|
||||
operation.targets["rust-cli"].cli_full_command = "account show"
|
||||
elif resource_name == "container":
|
||||
if operation_name == "get":
|
||||
operation.targets["rust-cli"].cli_full_command = "object list"
|
||||
elif operation_name == "head":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "container show"
|
||||
elif resource_name == "object":
|
||||
if operation_name == "get":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "object download"
|
||||
operation.operation_type = "download"
|
||||
elif operation_name == "head":
|
||||
operation.targets["rust-cli"].cli_full_command = "object show"
|
||||
elif operation_name == "put":
|
||||
operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command = "object upload"
|
||||
operation.operation_type = "upload"
|
||||
|
||||
return operation
|
69
codegenerator/metadata/placement.py
Normal file
69
codegenerator/metadata/placement.py
Normal file
@ -0,0 +1,69 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class PlacementMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
path_elements: list[str] = path.split("/")
|
||||
|
||||
if (
|
||||
resource_name
|
||||
in [
|
||||
"allocation_candidate",
|
||||
"resource_provider/allocation",
|
||||
"usage",
|
||||
]
|
||||
and method == "get"
|
||||
):
|
||||
operation_key = "list"
|
||||
elif (
|
||||
resource_name
|
||||
in ["resource_provider/aggregate", "resource_provider/trait"]
|
||||
and method == "put"
|
||||
):
|
||||
operation_key = "update"
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
if resource_name == "allocation_candidate":
|
||||
if operation_name == "list":
|
||||
operation.operation_type = "show"
|
||||
elif resource_name == "resource_provider/aggregate":
|
||||
if operation_name == "list":
|
||||
operation.operation_type = "show"
|
||||
elif resource_name == "resource_provider/allocation":
|
||||
if operation_name == "list":
|
||||
operation.operation_type = "show"
|
||||
elif resource_name == "resource_provider/trait":
|
||||
if operation_name == "list":
|
||||
operation.operation_type = "show"
|
||||
if operation_name == "delete_all":
|
||||
operation.targets["rust-cli"].cli_full_command = operation.targets[
|
||||
"rust-cli"
|
||||
].cli_full_command.replace("delete-all", "purge")
|
||||
|
||||
return operation
|
33
codegenerator/metadata/shared_file_system.py
Normal file
33
codegenerator/metadata/shared_file_system.py
Normal file
@ -0,0 +1,33 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
import typing as ty
|
||||
|
||||
from codegenerator.types import OperationModel
|
||||
from codegenerator.metadata.base import MetadataBase
|
||||
|
||||
|
||||
class SharedFileSystemMetadata(MetadataBase):
|
||||
@staticmethod
|
||||
def get_operation_key(
|
||||
operation, path: str, method: str, resource_name: str
|
||||
) -> ty.Tuple[str | None, bool]:
|
||||
skip: bool = False
|
||||
operation_key: str | None = None
|
||||
|
||||
return (operation_key, skip)
|
||||
|
||||
@staticmethod
|
||||
def post_process_operation(
|
||||
resource_name: str, operation_name: str, operation
|
||||
):
|
||||
return operation
|
@ -135,19 +135,6 @@ resources:
|
||||
operation_name: os-extend_volume_completion
|
||||
find_implemented_by_sdk: true
|
||||
cli_full_command: volume extend-volume-completion
|
||||
os-unmanage:
|
||||
operation_id: volumes/id/action:post
|
||||
operation_type: action
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: os_unmanage
|
||||
operation_name: os-unmanage
|
||||
rust-cli:
|
||||
module_name: os_unmanage
|
||||
sdk_mod_name: os_unmanage
|
||||
operation_name: os-unmanage
|
||||
find_implemented_by_sdk: true
|
||||
cli_full_command: volume unmanage
|
||||
os-attach:
|
||||
operation_id: volumes/id/action:post
|
||||
operation_type: action
|
||||
@ -330,6 +317,19 @@ resources:
|
||||
operation_name: os-reimage
|
||||
find_implemented_by_sdk: true
|
||||
cli_full_command: volume reimage
|
||||
os-unmanage:
|
||||
operation_id: volumes/id/action:post
|
||||
operation_type: action
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: os_unmanage
|
||||
operation_name: os-unmanage
|
||||
rust-cli:
|
||||
module_name: os_unmanage
|
||||
sdk_mod_name: os_unmanage
|
||||
operation_name: os-unmanage
|
||||
find_implemented_by_sdk: true
|
||||
cli_full_command: volume unmanage
|
||||
os-set-image-metadata:
|
||||
operation_id: volumes/id/action:post
|
||||
operation_type: action
|
||||
@ -985,19 +985,6 @@ resources:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: snapshot create
|
||||
os-update-snapshot-status:
|
||||
operation_id: snapshots/id/action:post
|
||||
operation_type: action
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: os_update_snapshot_status
|
||||
operation_name: os-update_snapshot_status
|
||||
rust-cli:
|
||||
module_name: os_update_snapshot_status
|
||||
sdk_mod_name: os_update_snapshot_status
|
||||
operation_name: os-update_snapshot_status
|
||||
find_implemented_by_sdk: true
|
||||
cli_full_command: snapshot update-status
|
||||
os-reset-status:
|
||||
operation_id: snapshots/id/action:post
|
||||
operation_type: action
|
||||
@ -1037,6 +1024,19 @@ resources:
|
||||
operation_name: os-unmanage
|
||||
find_implemented_by_sdk: true
|
||||
cli_full_command: snapshot unmanage
|
||||
os-update-snapshot-status:
|
||||
operation_id: snapshots/id/action:post
|
||||
operation_type: action
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: os_update_snapshot_status
|
||||
operation_name: os-update_snapshot_status
|
||||
rust-cli:
|
||||
module_name: os_update_snapshot_status
|
||||
sdk_mod_name: os_update_snapshot_status
|
||||
operation_name: os-update_snapshot_status
|
||||
find_implemented_by_sdk: true
|
||||
cli_full_command: snapshot update-status
|
||||
show:
|
||||
operation_id: snapshots/id:get
|
||||
operation_type: show
|
||||
@ -1090,10 +1090,12 @@ resources:
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
response_key: limits
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
operation_type: show
|
||||
response_key: limits
|
||||
cli_full_command: limit list
|
||||
block-storage.snapshot/metadata:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
@ -1689,6 +1691,216 @@ resources:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: extension list
|
||||
block-storage.capability:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
show:
|
||||
operation_id: capabilities/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: capability show
|
||||
block-storage.type/extra_spec:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list:
|
||||
operation_id: types/type_id/extra_specs:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: type extra-spec list
|
||||
create:
|
||||
operation_id: types/type_id/extra_specs:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: type extra-spec create
|
||||
show:
|
||||
operation_id: types/type_id/extra_specs/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: type extra-spec show
|
||||
update:
|
||||
operation_id: types/type_id/extra_specs/id:put
|
||||
operation_type: set
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: set
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: type extra-spec set
|
||||
delete:
|
||||
operation_id: types/type_id/extra_specs/id:delete
|
||||
operation_type: delete
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: delete
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: type extra-spec delete
|
||||
block-storage.availability_zone:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
get:
|
||||
operation_id: os-availability-zone:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
operation_name: list
|
||||
response_key: availabilityZoneInfo
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
operation_name: list
|
||||
response_key: availabilityZoneInfo
|
||||
cli_full_command: availability-zone list
|
||||
block-storage.volume_manage:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list_detailed:
|
||||
operation_id: os-volume-manage/detail:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list_detailed
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list_detailed
|
||||
cli_full_command: volume-manage list
|
||||
get:
|
||||
operation_id: os-volume-manage:get
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: volume-manage get
|
||||
create:
|
||||
operation_id: os-volume-manage:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: volume-manage create
|
||||
block-storage.cgsnapshot:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list_detailed:
|
||||
operation_id: cgsnapshots/detail:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list_detailed
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list_detailed
|
||||
cli_full_command: cgsnapshot list
|
||||
list:
|
||||
operation_id: cgsnapshots:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
create:
|
||||
operation_id: cgsnapshots:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: cgsnapshot create
|
||||
show:
|
||||
operation_id: cgsnapshots/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: cgsnapshot show
|
||||
delete:
|
||||
operation_id: cgsnapshots/id:delete
|
||||
operation_type: delete
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: delete
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: cgsnapshot delete
|
||||
block-storage.type/volume_type_access:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
get:
|
||||
operation_id: types/type_id/os-volume-type-access:get
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
response_key: volume_type_access
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
response_key: volume_type_access
|
||||
cli_full_command: type volume-type-access get
|
||||
block-storage.service:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list:
|
||||
operation_id: os-services:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: service list
|
||||
update:
|
||||
operation_id: os-services/id:put
|
||||
operation_type: set
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: set
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: service set
|
||||
block-storage.type/encryption:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
@ -1743,40 +1955,74 @@ resources:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: type encryption delete
|
||||
block-storage.snapshot_manage:
|
||||
block-storage.quota_class_set:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list_detailed:
|
||||
operation_id: os-snapshot-manage/detail:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list_detailed
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list_detailed
|
||||
cli_full_command: snapshot-manage list
|
||||
get:
|
||||
operation_id: os-snapshot-manage:get
|
||||
operation_type: get
|
||||
show:
|
||||
operation_id: os-quota-class-sets/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: get
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: snapshot-manage get
|
||||
create:
|
||||
operation_id: os-snapshot-manage:post
|
||||
operation_type: create
|
||||
cli_full_command: quota-class-set show
|
||||
update:
|
||||
operation_id: os-quota-class-sets/id:put
|
||||
operation_type: set
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
module_name: set
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: snapshot-manage create
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: quota-class-set set
|
||||
block-storage.quota_set:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
defaults:
|
||||
operation_id: os-quota-sets/id/defaults:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: defaults
|
||||
rust-cli:
|
||||
module_name: defaults
|
||||
sdk_mod_name: defaults
|
||||
cli_full_command: quota-set defaults
|
||||
show:
|
||||
operation_id: os-quota-sets/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: quota-set show
|
||||
update:
|
||||
operation_id: os-quota-sets/id:put
|
||||
operation_type: set
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: set
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: quota-set set
|
||||
delete:
|
||||
operation_id: os-quota-sets/id:delete
|
||||
operation_type: delete
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: delete
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: quota-set delete
|
||||
block-storage.qos_spec:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
@ -1906,12 +2152,12 @@ resources:
|
||||
operation_name: list
|
||||
response_key: qos_associations
|
||||
cli_full_command: qos-spec association list
|
||||
block-storage.cgsnapshot:
|
||||
block-storage.snapshot_manage:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list_detailed:
|
||||
operation_id: cgsnapshots/detail:get
|
||||
operation_id: os-snapshot-manage/detail:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
@ -1919,15 +2165,19 @@ resources:
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list_detailed
|
||||
cli_full_command: cgsnapshot list
|
||||
list:
|
||||
operation_id: cgsnapshots:get
|
||||
operation_type: list
|
||||
cli_full_command: snapshot-manage list
|
||||
get:
|
||||
operation_id: os-snapshot-manage:get
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: snapshot-manage get
|
||||
create:
|
||||
operation_id: cgsnapshots:post
|
||||
operation_id: os-snapshot-manage:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
@ -1935,49 +2185,13 @@ resources:
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: cgsnapshot create
|
||||
show:
|
||||
operation_id: cgsnapshots/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: cgsnapshot show
|
||||
delete:
|
||||
operation_id: cgsnapshots/id:delete
|
||||
operation_type: delete
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: delete
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: cgsnapshot delete
|
||||
block-storage.type/volume_type_access:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
get:
|
||||
operation_id: types/type_id/os-volume-type-access:get
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
response_key: volume_type_access
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
response_key: volume_type_access
|
||||
cli_full_command: type volume-type-access get
|
||||
block-storage.type/extra_spec:
|
||||
cli_full_command: snapshot-manage create
|
||||
block-storage.host:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list:
|
||||
operation_id: types/type_id/extra_specs:get
|
||||
operation_id: os-hosts:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
@ -1985,19 +2199,9 @@ resources:
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: type extra-spec list
|
||||
create:
|
||||
operation_id: types/type_id/extra_specs:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: type extra-spec create
|
||||
cli_full_command: host list
|
||||
show:
|
||||
operation_id: types/type_id/extra_specs/id:get
|
||||
operation_id: os-hosts/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
@ -2005,27 +2209,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: type extra-spec show
|
||||
update:
|
||||
operation_id: types/type_id/extra_specs/id:put
|
||||
operation_type: set
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: set
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: type extra-spec set
|
||||
delete:
|
||||
operation_id: types/type_id/extra_specs/id:delete
|
||||
operation_type: delete
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: delete
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: type extra-spec delete
|
||||
cli_full_command: host show
|
||||
block-storage.backup/import_record:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
@ -2068,40 +2252,6 @@ resources:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: backup export-record get
|
||||
block-storage.volume_manage:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list_detailed:
|
||||
operation_id: os-volume-manage/detail:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list_detailed
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list_detailed
|
||||
cli_full_command: volume-manage list
|
||||
get:
|
||||
operation_id: os-volume-manage:get
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: volume-manage get
|
||||
create:
|
||||
operation_id: os-volume-manage:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: volume-manage create
|
||||
block-storage.os_volume_transfer:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
@ -2182,24 +2332,44 @@ resources:
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
list_mod: list_detailed
|
||||
block-storage.availability_zone:
|
||||
block-storage.scheduler_stat/get_pool:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
get:
|
||||
operation_id: os-availability-zone:get
|
||||
operation_id: scheduler-stats/get_pools:get
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: scheduler-stat get-pool get
|
||||
block-storage.volume/encryption:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list:
|
||||
operation_id: volumes/volume_id/encryption:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
operation_name: list
|
||||
response_key: availabilityZoneInfo
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
operation_name: list
|
||||
response_key: availabilityZoneInfo
|
||||
cli_full_command: availability-zone list
|
||||
cli_full_command: volume encryption list
|
||||
show:
|
||||
operation_id: volumes/volume_id/encryption/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: volume encryption show
|
||||
block-storage.consistencygroup/create_from_src:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
@ -2228,175 +2398,3 @@ resources:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: consistencygroup delete create
|
||||
block-storage.quota_class_set:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
show:
|
||||
operation_id: os-quota-class-sets/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: quota-class-set show
|
||||
update:
|
||||
operation_id: os-quota-class-sets/id:put
|
||||
operation_type: set
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: set
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: quota-class-set set
|
||||
block-storage.host:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list:
|
||||
operation_id: os-hosts:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: host list
|
||||
show:
|
||||
operation_id: os-hosts/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: host show
|
||||
block-storage.volume/encryption:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list:
|
||||
operation_id: volumes/volume_id/encryption:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: volume encryption list
|
||||
show:
|
||||
operation_id: volumes/volume_id/encryption/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: volume encryption show
|
||||
block-storage.capability:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
show:
|
||||
operation_id: capabilities/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: capability show
|
||||
block-storage.scheduler_stat/get_pool:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
get:
|
||||
operation_id: scheduler-stats/get_pools:get
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: scheduler-stat get-pool get
|
||||
block-storage.service:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
list:
|
||||
operation_id: os-services:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: service list
|
||||
update:
|
||||
operation_id: os-services/id:put
|
||||
operation_type: set
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: set
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: service set
|
||||
block-storage.quota_set/default:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
get:
|
||||
operation_id: os-quota-sets/id/defaults:get
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: quota-set default get
|
||||
block-storage.quota_set:
|
||||
spec_file: wrk/openapi_specs/block-storage/v3.yaml
|
||||
api_version: v3
|
||||
operations:
|
||||
show:
|
||||
operation_id: os-quota-sets/id:get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: get
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: quota-set show
|
||||
update:
|
||||
operation_id: os-quota-sets/id:put
|
||||
operation_type: set
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: set
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: quota-set set
|
||||
delete:
|
||||
operation_id: os-quota-sets/id:delete
|
||||
operation_type: delete
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: delete
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: quota-set delete
|
||||
|
@ -504,7 +504,7 @@ resources:
|
||||
cli_full_command: domain config set
|
||||
default:
|
||||
operation_id: domains/config/default:get
|
||||
operation_type: get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: default
|
||||
@ -561,7 +561,7 @@ resources:
|
||||
cli_full_command: domain config group set
|
||||
default:
|
||||
operation_id: domains/config/group/default:get
|
||||
operation_type: get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: default
|
||||
@ -620,7 +620,7 @@ resources:
|
||||
cli_full_command: domain config group option set
|
||||
default:
|
||||
operation_id: domains/config/group/option/default:get
|
||||
operation_type: get
|
||||
operation_type: show
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: default
|
||||
@ -968,11 +968,31 @@ resources:
|
||||
api_version: v3
|
||||
operations:
|
||||
check:
|
||||
operation_id: limits:head
|
||||
operation_id: limits/limit_id:head
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: head
|
||||
list:
|
||||
operation_id: limits:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: limit list
|
||||
create:
|
||||
operation_id: limits:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: limit create
|
||||
show:
|
||||
operation_id: limits/limit_id:get
|
||||
operation_type: show
|
||||
@ -1003,26 +1023,6 @@ resources:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: limit set
|
||||
list:
|
||||
operation_id: limits:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: limit list
|
||||
create:
|
||||
operation_id: limits:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: limit create
|
||||
identity.limit/model:
|
||||
spec_file: wrk/openapi_specs/identity/v3.yaml
|
||||
api_version: v3
|
||||
@ -1062,7 +1062,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: OS-EP-FILTER endpoint-group show
|
||||
cli_full_command: endpoint-filter endpoint-group show
|
||||
delete:
|
||||
operation_id: OS-EP-FILTER/endpoint_groups/endpoint_group_id:delete
|
||||
operation_type: delete
|
||||
@ -1072,7 +1072,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: OS-EP-FILTER endpoint-group delete
|
||||
cli_full_command: endpoint-filter endpoint-group delete
|
||||
update:
|
||||
operation_id: OS-EP-FILTER/endpoint_groups/endpoint_group_id:patch
|
||||
operation_type: set
|
||||
@ -1082,7 +1082,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: OS-EP-FILTER endpoint-group set
|
||||
cli_full_command: endpoint-filter endpoint-group set
|
||||
list:
|
||||
operation_id: OS-EP-FILTER/endpoint_groups:get
|
||||
operation_type: list
|
||||
@ -1092,7 +1092,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: OS-EP-FILTER endpoint-group list
|
||||
cli_full_command: endpoint-filter endpoint-group list
|
||||
create:
|
||||
operation_id: OS-EP-FILTER/endpoint_groups:post
|
||||
operation_type: create
|
||||
@ -1102,7 +1102,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: OS-EP-FILTER endpoint-group create
|
||||
cli_full_command: endpoint-filter endpoint-group create
|
||||
identity.OS_EP_FILTER/endpoint/project:
|
||||
spec_file: wrk/openapi_specs/identity/v3.yaml
|
||||
api_version: v3
|
||||
@ -1122,7 +1122,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: OS-EP-FILTER endpoint project get
|
||||
cli_full_command: endpoint-filter endpoint project get
|
||||
identity.OS_EP_FILTER/project/endpoint:
|
||||
spec_file: wrk/openapi_specs/identity/v3.yaml
|
||||
api_version: v3
|
||||
@ -1142,7 +1142,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: OS-EP-FILTER project endpoint show
|
||||
cli_full_command: endpoint-filter project endpoint show
|
||||
update:
|
||||
operation_id: OS-EP-FILTER/projects/project_id/endpoints/endpoint_id:put
|
||||
operation_type: set
|
||||
@ -1152,7 +1152,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: OS-EP-FILTER project endpoint set
|
||||
cli_full_command: endpoint-filter project endpoint set
|
||||
delete:
|
||||
operation_id: OS-EP-FILTER/projects/project_id/endpoints/endpoint_id:delete
|
||||
operation_type: delete
|
||||
@ -1162,7 +1162,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: OS-EP-FILTER project endpoint delete
|
||||
cli_full_command: endpoint-filter project endpoint delete
|
||||
list:
|
||||
operation_id: OS-EP-FILTER/projects/project_id/endpoints:get
|
||||
operation_type: list
|
||||
@ -1172,7 +1172,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: OS-EP-FILTER project endpoint list
|
||||
cli_full_command: endpoint-filter project endpoint list
|
||||
identity.OS_EP_FILTER/project/endpoint_group:
|
||||
spec_file: wrk/openapi_specs/identity/v3.yaml
|
||||
api_version: v3
|
||||
@ -1192,7 +1192,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: OS-EP-FILTER project endpoint-group get
|
||||
cli_full_command: endpoint-filter project endpoint-group get
|
||||
identity.OS_EP_FILTER/endpoint_group/endpoint:
|
||||
spec_file: wrk/openapi_specs/identity/v3.yaml
|
||||
api_version: v3
|
||||
@ -1212,7 +1212,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: get
|
||||
sdk_mod_name: get
|
||||
cli_full_command: OS-EP-FILTER endpoint-group endpoint get
|
||||
cli_full_command: endpoint-filter endpoint-group endpoint get
|
||||
identity.OS_EP_FILTER/endpoint_group/project:
|
||||
spec_file: wrk/openapi_specs/identity/v3.yaml
|
||||
api_version: v3
|
||||
@ -1232,7 +1232,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: OS-EP-FILTER endpoint-group project list
|
||||
cli_full_command: endpoint-filter endpoint-group project list
|
||||
show:
|
||||
operation_id: OS-EP-FILTER/endpoint_groups/endpoint_group_id/projects/project_id:get
|
||||
operation_type: show
|
||||
@ -1242,7 +1242,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: show
|
||||
sdk_mod_name: get
|
||||
cli_full_command: OS-EP-FILTER endpoint-group project show
|
||||
cli_full_command: endpoint-filter endpoint-group project show
|
||||
update:
|
||||
operation_id: OS-EP-FILTER/endpoint_groups/endpoint_group_id/projects/project_id:put
|
||||
operation_type: set
|
||||
@ -1252,7 +1252,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: set
|
||||
sdk_mod_name: set
|
||||
cli_full_command: OS-EP-FILTER endpoint-group project set
|
||||
cli_full_command: endpoint-filter endpoint-group project set
|
||||
delete:
|
||||
operation_id: OS-EP-FILTER/endpoint_groups/endpoint_group_id/projects/project_id:delete
|
||||
operation_type: delete
|
||||
@ -1262,7 +1262,7 @@ resources:
|
||||
rust-cli:
|
||||
module_name: delete
|
||||
sdk_mod_name: delete
|
||||
cli_full_command: OS-EP-FILTER endpoint-group project delete
|
||||
cli_full_command: endpoint-filter endpoint-group project delete
|
||||
identity.OS_FEDERATION/saml2/metadata:
|
||||
spec_file: wrk/openapi_specs/identity/v3.yaml
|
||||
api_version: v3
|
||||
@ -2175,11 +2175,31 @@ resources:
|
||||
api_version: v3
|
||||
operations:
|
||||
check:
|
||||
operation_id: projects:head
|
||||
operation_id: projects/project_id:head
|
||||
operation_type: get
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: head
|
||||
list:
|
||||
operation_id: projects:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: project list
|
||||
create:
|
||||
operation_id: projects:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: project create
|
||||
show:
|
||||
operation_id: projects/project_id:get
|
||||
operation_type: show
|
||||
@ -2213,26 +2233,6 @@ resources:
|
||||
sdk_mod_name: set
|
||||
find_implemented_by_sdk: true
|
||||
cli_full_command: project set
|
||||
list:
|
||||
operation_id: projects:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: project list
|
||||
create:
|
||||
operation_id: projects:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: project create
|
||||
find:
|
||||
operation_id: projects:get
|
||||
operation_type: find
|
||||
|
@ -719,6 +719,30 @@ resources:
|
||||
module_name: stage
|
||||
sdk_mod_name: stage
|
||||
cli_full_command: image stage stage
|
||||
image.image/location:
|
||||
spec_file: wrk/openapi_specs/image/v2.yaml
|
||||
api_version: v2
|
||||
operations:
|
||||
list:
|
||||
operation_id: images/image_id/locations:get
|
||||
operation_type: list
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: list
|
||||
rust-cli:
|
||||
module_name: list
|
||||
sdk_mod_name: list
|
||||
cli_full_command: image location list
|
||||
create:
|
||||
operation_id: images/image_id/locations:post
|
||||
operation_type: create
|
||||
targets:
|
||||
rust-sdk:
|
||||
module_name: create
|
||||
rust-cli:
|
||||
module_name: create
|
||||
sdk_mod_name: create
|
||||
cli_full_command: image location create
|
||||
image.image/tag:
|
||||
spec_file: wrk/openapi_specs/image/v2.yaml
|
||||
api_version: v2
|
||||
|
@ -111,7 +111,7 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::loadbalancer
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
load-balancer.listener:
|
||||
spec_file: wrk/openapi_specs/load-balancer/v2.yaml
|
||||
@ -189,7 +189,7 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::listener
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
load-balancer.pool:
|
||||
spec_file: wrk/openapi_specs/load-balancer/v2.yaml
|
||||
@ -256,7 +256,7 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::pool
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
load-balancer.l7policy:
|
||||
spec_file: wrk/openapi_specs/load-balancer/v2.yaml
|
||||
@ -323,7 +323,7 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::l7policy
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
load-balancer.healthmonitor:
|
||||
spec_file: wrk/openapi_specs/load-balancer/v2.yaml
|
||||
@ -390,7 +390,7 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::healthmonitor
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
load-balancer.quota:
|
||||
spec_file: wrk/openapi_specs/load-balancer/v2.yaml
|
||||
@ -515,7 +515,7 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::flavor
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
load-balancer.flavor_profile:
|
||||
spec_file: wrk/openapi_specs/load-balancer/v2.yaml
|
||||
@ -582,7 +582,7 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::flavor_profile
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
load-balancer.availability_zone:
|
||||
spec_file: wrk/openapi_specs/load-balancer/v2.yaml
|
||||
@ -703,7 +703,7 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::availability_zone_profile
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
load-balancer.octavia:
|
||||
spec_file: wrk/openapi_specs/load-balancer/v2.yaml
|
||||
@ -941,5 +941,5 @@ resources:
|
||||
module_name: find
|
||||
sdk_mod_path: load_balancer::v2::pool::member
|
||||
name_field: name
|
||||
name_filter_supported: false
|
||||
name_filter_supported: true
|
||||
list_mod: list
|
||||
|
Loading…
x
Reference in New Issue
Block a user