diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..1e99dfac Binary files /dev/null and b/.DS_Store differ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..a7976669 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: 🗣 Subproject discussions + url: https://github.com/camaraproject/EdgeCloud/discussions + about: Please ask and answer questions here. + - name: 📖 CAMARA API Design Guidelines + url: https://github.com/camaraproject/Commonalities/blob/main/documentation/API-design-guidelines.md + about: Please refer to the design guidelines. diff --git a/.github/ISSUE_TEMPLATE/issue_correction_template.md b/.github/ISSUE_TEMPLATE/issue_correction_template.md new file mode 100644 index 00000000..488e70b5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_correction_template.md @@ -0,0 +1,21 @@ +--- +name: ❗ Correction 👣 +about: Suggest the correction of an issue in API specification or a misalignment with API design guidelines +title: '' +labels: 'correction' +assignees: '' + +--- + +**Problem description** + + +**Expected behavior** + + + +**Alternative solution** + + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/issue_documentation_template.md b/.github/ISSUE_TEMPLATE/issue_documentation_template.md new file mode 100644 index 00000000..f7b8de02 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_documentation_template.md @@ -0,0 +1,18 @@ +--- +name: ❕ Documentation 📝 +about: Indicate an issue with API documentation or supplementary documents +title: '' +labels: 'documentation' +assignees: '' + +--- + +**Problem description** + + +**Expected action** + + + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/issue_enhancement_template.md b/.github/ISSUE_TEMPLATE/issue_enhancement_template.md new file mode 100644 index 00000000..279ce49a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_enhancement_template.md @@ -0,0 +1,20 @@ +--- +name: 💡 Enhancement 🌟 +about: Suggest an idea for a new API feature or pose a question on directions for API evolution +title: '' +labels: 'enhancement' +assignees: '' + +--- + +**Problem description** + + +**Possible evolution** + + +**Alternative solution** + + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/issue_pm_template.md b/.github/ISSUE_TEMPLATE/issue_pm_template.md new file mode 100644 index 00000000..210a2f06 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_pm_template.md @@ -0,0 +1,18 @@ +--- +name: ☁ Subproject management 🎂 +about: Indicate an issue with subproject repository or release management +title: '' +labels: 'subproject management' +assignees: '' + +--- + +**Problem description** + + +**Expected action** + + + +**Additional context** + diff --git a/.github/ISSUE_TEMPLATE/issue_tests_template.md b/.github/ISSUE_TEMPLATE/issue_tests_template.md new file mode 100644 index 00000000..170874a8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_tests_template.md @@ -0,0 +1,18 @@ +--- +name: ⁉ Tests 🔎 +about: Indicate an issue with API tests +title: '' +labels: 'tests' +assignees: '' + +--- + +**Problem description** + + +**Expected action** + + + +**Additional context** + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..37952b59 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,45 @@ +#### What type of PR is this? + +Add one of the following kinds: +* bug +* correction +* enhancement/feature +* cleanup +* documentation +* subproject management +* tests + + +#### What this PR does / why we need it: + + + + +#### Which issue(s) this PR fixes: + + + +Fixes # + +#### Special notes for reviewers: + + + +#### Changelog input + +``` + release-note + +``` + +#### Additional documentation + +This section can be blank. + + + +``` +docs + +``` diff --git a/.github/workflows/megalinter.yml b/.github/workflows/megalinter.yml new file mode 100644 index 00000000..6bda7009 --- /dev/null +++ b/.github/workflows/megalinter.yml @@ -0,0 +1,78 @@ +--- +# MegaLinter GitHub Action configuration file +# More info at https://megalinter.io +# CAMARA Project - Github Action for Pull Reqests +# 31.01.2024 - initial version + +name: MegaLinter + +on: # yamllint disable-line rule:truthy + # Pull Requests to main + pull_request: + branches: [master, main] + +env: # Comment env block if you do not want to apply fixes + # Apply linter fixes configuration + APPLY_FIXES: all # When active, APPLY_FIXES must also be defined as environment variable (in github/workflows/mega-linter.yml or other CI tool) + APPLY_FIXES_EVENT: pull_request # Decide which event triggers application of fixes in a commit or a PR (pull_request, push, all) + APPLY_FIXES_MODE: commit # If APPLY_FIXES is used, defines if the fixes are directly committed (commit) or posted in a PR (pull_request) + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + build: + name: MegaLinter + runs-on: ubuntu-latest + permissions: + # Give the default GITHUB_TOKEN write permission to commit and push, comment issues & post new PR + # Remove the ones you do not need + contents: write + issues: write + pull-requests: write + steps: + # Git Checkout + - name: Checkout Code + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 0 # If you use VALIDATE_ALL_CODEBASE = true, you can remove this line to improve performances + - name: Install Spectral + run: npm install -g @stoplight/spectral + - name: Install Spectral functions + run: npm install -g @stoplight/spectral-functions + # - name: Run spectral:oas Spectral Linting + # run: spectral lint code/API_definitions/*.yaml --verbose --ruleset .spectral.yml + # Replace openapi.yaml file with your API specification file + + # MegaLinter + - name: MegaLinter + id: ml + # You can override MegaLinter flavor used to have faster performances + # More info at https://megalinter.io/flavors/ + uses: oxsecurity/megalinter/flavors/java@v7.3.0 + env: + # All available variables are described in documentation + # https://megalinter.io/configuration/ + PRINT_ALPACA: false + # VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} # Validates all source when push on main, else just the git diff with main. Override with true if you always want to lint all sources + VALIDATE_ALL_CODEBASE: true + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # ADD YOUR CUSTOM ENV VARIABLES HERE OR DEFINE THEM IN A FILE .mega-linter.yml AT THE ROOT OF YOUR REPOSITORY + DISABLE: COPYPASTE,MARKDOWN + DISABLE_LINTERS: SPELL_CSPELL,SPELL_LYCHEE,YAML_PRETTIER,REPOSITORY_GRYPE, REPOSITORY_SEMGREP,REPOSITORY_DEVSKIM,REPOSITORY_KICS,REPOSITORY_TRIVY,REPOSITORY_TRIVY_SBOM,REPOSITORY_TRUFFLEHOG,REPOSITORY_CHECKOV,REPOSITORY_GITLEAKS,YAML_V8R,JAVA_PMD,JAVA_CHECKSTYLE + YAML_YAMLLINT_CONFIG_FILE: ".yamllint.yaml" + OPENAPI_SPECTRAL_CONFIG_FILE: ".spectral.yml" + YAML_YAMLLINT_FILTER_REGEX_INCLUDE: "(code/)" + OPENAPI_SPECTRAL_FILTER_REGEX_INCLUDE: "(code/)" + + # Upload MegaLinter artifacts + - name: Archive production artifacts + if: ${{ success() }} || ${{ failure() }} + uses: actions/upload-artifact@v4 + with: + name: MegaLinter reports + path: | + megalinter-reports + mega-linter.log diff --git a/.github/workflows/spectral_oas_lint.yml b/.github/workflows/spectral_oas_lint.yml new file mode 100644 index 00000000..a828fd58 --- /dev/null +++ b/.github/workflows/spectral_oas_lint.yml @@ -0,0 +1,36 @@ +--- +# CAMARA Project - workflow configuration to manually run CAMARA OAS rules +# see https://docs.github.com/en/actions/using-workflows/manually-running-a-workflow +# 31.01.2024 - initial version + +name: Spectral manual run + +on: workflow_dispatch + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + build: + name: Spectral linting + runs-on: ubuntu-latest + permissions: + # Give the default GITHUB_TOKEN write permission to commit and push, comment issues & post new PR + # Remove the ones you do not need + contents: write + issues: write + pull-requests: write + steps: + # Git Checkout + - name: Checkout Code + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 0 # If you use VALIDATE_ALL_CODEBASE = true, you can remove this line to improve performances + - name: Install Spectral + run: npm install -g @stoplight/spectral + - name: Install Spectral functions + run: npm install -g @stoplight/spectral-functions + - name: Run Spectral linting + run: spectral lint code/API_definitions/*.yaml --verbose --ruleset .spectral.yml diff --git a/.spectral.yml b/.spectral.yml new file mode 100644 index 00000000..0042b3c4 --- /dev/null +++ b/.spectral.yml @@ -0,0 +1,261 @@ +# CAMARA Project - linting ruleset - documentation avaialable here: +# https://github.com/camaraproject/Commonalities/blob/main/documentation/Linting-rules.md +# Changelog: +# - 31.01.2024: Initial version +# - 19.03.2024: Corrected camara-http-methods rule + + +extends: "spectral:oas" +functions: + - camara-reserved-words + - camara-language-avoid-telco + - camara-security-no-secrets-in-path-or-query-parameters +functionsDir: "./lint_function" +rules: + # Built-in OpenAPI Specification ruleset. Each rule then can be enabled individually. + # The severity keyword is optional in rule definition and can be error, warn, info, hint, or off. The default value is warn. + contact-properties: false + duplicated-entry-in-enum: true + info-contact: true + info-description: true + info-license: true + license-url: true + no-$ref-siblings: error + no-eval-in-markdown: true + no-script-tags-in-markdown: true + openapi-tags: false + openapi-tags-alphabetical: false + openapi-tags-uniqueness: error + operation-description: true + operation-operationId: true + operation-operationId-unique: error + operation-operationId-valid-in-url: true + operation-parameters: true + operation-singular-tag: true + operation-success-response: true + operation-tags: true + operation-tag-defined: true + path-declarations-must-exist: true + path-keys-no-trailing-slash: true + path-not-include-query: true + path-params: error + tag-description: false + typed-enum: true + oas3-api-servers: true + oas3-examples-value-or-externalValue: true + oas3-operation-security-defined: false + oas3-parameter-description: false + oas3-schema: true + oas3-server-not-example.com: false + oas3-server-trailing-slash: true + oas3-unused-component: true + oas3-valid-media-example: true + oas3-valid-schema-example: true + # oas3-server-variables: true + + # Custom Rules Utilizing Spectral's Built-in Functions and JavaScript Implementations + + camara-language-avoid-telco: + message: "{{error}}" + severity: hint + description: | + This rule checks for telco-specific terminology in your API definitions and suggests more inclusive terms. + given: "$..*.*" + then: + function: camara-language-avoid-telco + recommended: false # Set to true/false to enable/disable this rule + + camara-oas-version: + message: "OpenAPI Version Error: The OpenAPI specification must adhere to version 3.0.3." + severity: error + description: | + This rule validates the OpenAPI version in your specification and requires compliance with version 3.0.3. + given: "$" + then: + field: openapi + function: pattern + functionOptions: + match: 3.0.3 + recommended: true # Set to true/false to enable/disable this rule + + camara-path-param-id: + message: "Path Parameter Naming Warning: Use 'resource_id' instead of just 'id' in path parameters." + severity: warn + description: | + This rule ensures consistent and descriptive naming for path parameters in your OpenAPI specification. + Please use 'resource_id' instead of just 'id' for your path parameters. + given: "$..parameters[?(@.in == 'path')]" + then: + field: name + function: pattern + functionOptions: + notMatch: \b(id|Id|ID|iD)\b + recommended: true # Set to true/false to enable/disable this rule + + camara-security-no-secrets-in-path-or-query-parameters: + message: "Sensitive data found in path: {{error}} Consider avoiding the use of Sesentive data " + severity: warn + description: | + This rule checks for sensitive data ('MSISDN' and 'IMSI') in API paths and suggests avoiding their use. + given: + - "$.paths" + then: + function: camara-security-no-secrets-in-path-or-query-parameters + recommended: true # Set to true/false to enable/disable this rule + + camara-http-methods: + description: "Ensure that all path URLs have valid HTTP methods (GET, PUT, POST, DELETE, PATCH, OPTIONS)." + message: "Invalid HTTP method for '{{path}}'. Must be one of get, put, post, delete, patch, options." + severity: error + given: $.paths[*][*]~ + then: + function: pattern + functionOptions: + match: "^(get|put|post|delete|patch|options|parameters)$" + recommended: true # Set to true/false to enable/disable this rule + + camara-get-no-request-body: + message: There must be no request body for Get and DELETE + severity: error + given: + - "$.paths.*.get" + - "$.paths.*.delete" + then: + field: requestBody + function: falsy + recommended: true # Set to true/false to enable/disable this rule + + camara-reserved-words: + message: "Reserved words found {{error}} Consider avoiding the use of reserved word " + severity: warn + description: | + This rule checks Reserved words must not be used in the following parts of an API specification [Paths, Request Body properties, Component, Operation Id, Security Schema] + given: + - "$.paths" # Paths + - "$..parameters[*]" # Path or Query Parameter Names: + - "$..components.schemas.*.properties.*" # Request and Response body parameter + - "$.paths.*." # Path and Operation Names: + - "$.components.securitySchemes" # Security Schemes: + - "$.components.*.*" # Component Names: + - "$.paths.*.*.operationId" # OperationIds: + then: + function: camara-reserved-words + recommended: true # Set to true/false to enable/disable this rule + + camara-routes-description: + message: "Functionality method description Warning: Each method should have description." + severity: warn + description: | + This rule checks if each operation (POST, GET, DELETE, PUT, PATCH, OPTIONS) in your API specification has a description. + Ensure that you have added a 'summary' field for each operation in your OpenAPI specification. + given: + - "$.paths.*.post" + - "$.paths.*.get" + - "$.paths.*.delete" + - "$.paths.*.put" + - "$.paths.*.patch" + - "$.paths.*.options" + then: + field: description + function: truthy + recommended: true # Set to true/false to enable/disable this rule + + camara-parameters-descriptions: + message: "Parameter description is missing or empty: {{error}}" + severity: warn + description: | + This Spectral rule ensures that each path parameter in the API specification has a descriptive and meaningful description. + given: + - "$.paths..parameters.*" + then: + field: description + function: truthy + recommended: true # Set to true/false to enable/disable this rule + + camara-response-descriptions: + message: "Parameter description is missing or empty: {{error}}" + severity: warn + description: | + This Spectral rule ensures that each responese object in the API specification has a descriptive and meaningful description. + given: + - "$.paths..responses.*" + then: + field: description + function: truthy + recommended: true # Set to true/false to enable/disable this rule + + camara-properties-descriptions: + message: "Property description is missing or empty: {{error}}" + severity: warn + description: | + This Spectral rule ensures that each propoerty within objects in the API specification has a descriptive and meaningful description. + given: + - "$.components.*.*" + - "$.components.*.*.properties.*" + then: + field: description + function: truthy + recommended: true # Set to true/false to enable/disable this rule + + camara-operation-summary: + message: "Operation Summary Warning: Each operation should include a short summary for better understanding." + severity: warn + description: | + This rule checks if each operation (POST, GET, DELETE, PUT, PATCH, OPTIONS) in your API specification has a meaningful summary. + Ensure that you have added a 'summary' field for each operation in your OpenAPI specification. + given: + - "$.paths.*.post" + - "$.paths.*.get" + - "$.paths.*.delete" + - "$.paths.*.put" + - "$.paths.*.patch" + - "$.paths.*.options" + then: + field: summary + function: truthy + recommended: true # Set to true/false to enable/disable this rule + + camara-discriminator-use: + description: | + Ensure that API definition YAML files with oneOf or anyOf sections include a discriminator object for serialization, deserialization, and validation. + severity: hint + given: "$..[?(@.oneOf || @.anyOf)]" + then: + field: discriminator + function: truthy + description: "Discriminator object is required when using oneOf or anyOf." + recommended: true # Set to true/false to enable/disable this rule + + camara-operationid-casing-convention: + message: Operation Id must be in Camel case "{{error}}" + severity: hint + description: | + This rule checks Operation ids should follow a specific case convention: camel case. + given: "$.paths.*.*.operationId" + then: + function: casing + functionOptions: + type: camel + recommended: true # Set to true/false to enable/disable this rule + + camara-schema-casing-convention: + description: This rule checks schema should follow a specific case convention pascal case. + message: "{{property}} should be pascal case (UppperCamelCase)" + severity: warn + given: $.components.schemas[*]~ + then: + function: casing + functionOptions: + type: pascal + recommended: true # Set to true/false to enable/disable this rule + + camara-parameter-casing-convention: + description: Paths should be kebab-case. + severity: error + message: "{{property}} is not kebab-case: {{error}}" + given: $.paths[*]~ + then: + function: pattern + functionOptions: + match: "^\/([a-z0-9]+(-[a-z0-9]+)*)?(\/[a-z0-9]+(-[a-z0-9]+)*|\/{.+})*$" # doesn't allow /asasd{asdas}sadas pattern or not closed braces + recommended: true # Set to true/false to enable/disable this rule diff --git a/CODEOWNERS b/CODEOWNERS index ffb3c459..535c2c90 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -6,4 +6,8 @@ # These are the default owners for the whole content of this repository. The default owners are automatically added as reviewers when you open a pull request, unless different owners are specified in the file. -* @gunjald @kevsy +* @gunjald @kevsy @crissancas @FabrizioMoggio @nicolacdnll @gainsley @javierlozallu + +# Owners of the CODEOWNER and Maintainer.md files are the admins of CAMARA (to allow them to keep the teams within the CAMARA organization in sync in case of changes) +/CODEOWNERS @camaraproject/admins +/MAINTAINERS.MD @camaraproject/admins diff --git a/MAINTAINERS.MD b/MAINTAINERS.MD index f54a7b8c..2388c042 100644 --- a/MAINTAINERS.MD +++ b/MAINTAINERS.MD @@ -1,7 +1,8 @@ -| Org | Name | -| -----------------------| ----------------------------------------------------| -| 5GFF| Kevin Smith | -| 5GFF | Mahesh Chapalamadugu | -| Capgemini | Deepak Gunjal | -| Telefonica | Cristina Santana Casillas | -| EdgeXR | Jon Gainsley | +| Org | Name | GitHub Username | +| -----------------------| -----------------------|-----------------------------| +| 5GFF| Kevin Smith | Kevsy | +| 5GFF | Mahesh Chapalamadugu | maheshc01 | +| Capgemini | Deepak Gunjal | deepakjaiswal1 | +| Telefonica | Cristina Santana Casillas | crissancas | +| EdgeXR | Jon Gainsley | gainsley | +| Orange | Frederic Fieau | FredericFi | diff --git a/README.md b/README.md index 8716acbd..ca8331ce 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,28 @@ - - - - - - +# Edge Cloud -# EdgeCloud -Repository to describe, develop, document and test the EdgeCloud API family +Repository to describe, develop, document, and test the EdgeCloud API family ## Scope -* Service APIs for “Edge Cloud” (see APIBacklog.md) + +* Service APIs for “Edge Cloud” (see APIBacklog.md) * It provides the customer with the ability to: - * Provide and manage application images to be deployed on resources within the operator network - * Use reserved compute resources within the operator network for the deployment of applications on VMs or containers + * Discover the closest edge cloud zone to a given device. + * Provide and manage application images to be deployed on resources within the operator network. + * Use reserved compute resources within the operator network for the deployment of applications on VMs or containers. + * Influence the traffic routing from the user device toward the Edge instance of the Application. * NOTE: The scope of this API family should be limited (at least at a first stage) to 4G and 5G. * Describe, develop, document and test the APIs (with 1-2 Telcos) * Started: 5th July 2022 -* Location: virtually -## Meetings -* Meetings are held virtually -* Schedule: Tuesdays 16h-17 CET, every two weeks. -* Meeting link: [Link](https://teams.microsoft.com/l/meetup-join/19%3ameeting_ZTk5NjBiZTgtYjc5OS00ODA5LTljMTEtNjZkNjNmYzdmZTE3%40thread.v2/0?context=%7b%22Tid%22%3a%229744600e-3e04-492e-baa1-25ec245c6f10%22%2c%22Oid%22%3a%2259beacec-cc69-4b31-873d-ba429711a3a7%22%7d) +# Release Information + +# Contributing -## Results -* Sub Project is in progress +* Meetings + * [Registration](https://zoom-lfx.platform.linuxfoundation.org/meeting/94237809115?password=05fb6d8a-a913-47d8-b003-db75ecdaa5d9) + * Schedule: Tuesdays 1400-1500 UTC, every two weeks. + * Minutes: Access [meeting minutes](https://wiki.camaraproject.org/display/CAM/Edge+Cloud) -## Contributorship and mailing list -* To subscribe / unsubscribe to the mailing list of this Sub Project and thus be / resign as Contributor please visit . -* A message to all Contributors of this Sub Project can be sent using . +* Mailing list + * Subscribe / unsubscribe to the mailing list of this Sub Project [https://lists.camaraproject.org/g/sp-edc](https://lists.camaraproject.org/g/sp-edc). + * A message to the community of this Sub Project can be sent using [sp-edc@lists.camaraproject.org](sp-edc@lists.camaraproject.org). \ No newline at end of file diff --git a/code/.DS_Store b/code/.DS_Store new file mode 100644 index 00000000..b83402a8 Binary files /dev/null and b/code/.DS_Store differ diff --git a/code/API_definitions/.DS_Store b/code/API_definitions/.DS_Store new file mode 100644 index 00000000..0ee9b157 Binary files /dev/null and b/code/API_definitions/.DS_Store differ diff --git a/code/API_definitions/Edge-Application-Management.yaml b/code/API_definitions/Edge-Application-Management.yaml new file mode 100644 index 00000000..fc4d6843 --- /dev/null +++ b/code/API_definitions/Edge-Application-Management.yaml @@ -0,0 +1,1161 @@ +--- +openapi: 3.0.3 +info: + title: Edge Application Management API + version: 0.9.3-wip + description: | + Edge Application Management API allows API consumers to manage the + Life Cycle of an Application and to Discover Edge Cloud Zones. + # Overview + The reference scenario foresees a distributed Telco Edge Cloud where any + Application Delevoper, known as an Application Provider, can host and + deploy their application according to their specifications and operational + criteria (e.g. within an specific geographical zone for data protection + purposes, ensure a minimum QoS for the application clients, etc). + Through Telco Edge Cloud services Developers around the globe can be + benefit from the traditional Cloud strengths but expertise and advantages + of the Mobile Network Operators offering to their users an evolved + experience for XR, V2X, Holographic and other new services. + + # Introduction + The Edge Application Management API provides capabilities for lifecycle + management of application, instances and edge cloud zone discovery. + Lifecycle Management allows Application Provider to onboard + their application to the Edge Cloud Platform which do bookkeeping, + resource validation and other pre-deployment operations. + Application details can contain components network specification, + package type (QCOW2, OVA, CONTAINER, HELM), operating system details and + respository to download the image of the desired application. + Once the application is available on the Edge Cloud + Platform, the Application Provider can instantiate the application. + Edge Cloud Provider helps Application Provider to decide where to + instantiate the applications allowing them to retrieve a list of + Edge Cloud Zones that meets the provided criteria. + + This discovery can be filtered by an specific geographical region + (e.g when data residency is need) and by status (active, inactive, unknown) + Application Provider can ask the Edge Cloud Platform to instantiate the + application to one or several Edge Cloud Zones that meet the criteria. + Typically when more than one Edge Cloud Zone is required in the same + geographic boundary, Application Provider can define instead + the entire Edge Cloud Region. + + Application Provider can retrieve the information of the instances + for a given application, the information could be the Edge Cloud Zone + where the instance is, status (ready, instantiating, failed, + terminating, unknown) and endpoint (ip, port, fqdn). + Application Provider can terminate an instance of an application + (appInstanceId) or all the instances for a given appId. + + # Quick Start + The usage of this API is based on several resources including GSMA + Edge Platform, Public Cloud and SDOs, to define a first approach on the + lifecycle management of application instances and edge cloud zones discovery + + Before starting to use the API, the developer needs to know about + the below specified details. + + __Application Management__ + * __submitApp__ - Submits application details to an Edge Cloud Provider. + Based on the details provided, Edge Cloud Provider shall do bookkeeping, + resource validation and other pre-deployment operations. + * __deleteApp__ - Removes an application from an Edge Cloud Provider, + if there is a running instance of the given application, + the request cannot be done. + * __getApp__ - Retrieves the information of a given application. + + __Application Instance Management__ + * __createAppInstance__ Request the Edge Cloud Provider to instatiate + an instance of an application in a given Edge Cloud Zone, + if this parameter is not set, the Edge Cloud Provider will instantiate + the applications in all the Edge Cloud Zones. + * __getAppInstance__ Retrieves the list with information of the instances + related to a given application. + * __deleteAppInstance__ - Removes a given application instance from an Edge + Cloud Zone. + + __Edge Cloud information__ + * __getEdgeCloudZones__ List of the operators Edge Cloud Zones and their + status, ordering the results by location and filtering by status + (active/inactive/unknown) + + # Authentication and Authorization + CAMARA guidelines defines a set of authorization flows which can grant API + clients access to the API functionality, as outlined in the document + [CAMARA-API-access-and-user-consent.md](https://github.com/camaraproject\ + /IdentityAndConsentManagement/blob/main/documentation/CAMARA-API-access\ + -and-user-consent.md). + Which specific authorization flows are to be used will be determined during + onboarding process, happening between the API Client and the Telco Edge + exposing the API, taking into account the declared purpose for accessing the + API, while also being subject to the prevailing legal framework dictated by + local legislation. + + It is important to remark that in cases where personal user data is + processed by the API, and users can exercise their rights through mechanisms + such as opt-in and/or opt-out, the use of 3-legged access tokens becomes + mandatory. This measure ensures that the API remains in strict compliance + with user privacy preferences and regulatory obligations, upholding the + principles of transparency and user-centric data control. + # API documentation + Two operations have been defined in Edge Application Management API. + + *__Application__* - The Application Provider submit application metadata to + the Edge Cloud Platform. The Edge Cloud Platform generates an appId for that + metadata that will be used to instantiate the application within + the Edge Cloud Zone. + + *__Edge Cloud__* - Retrieves all the Edge Cloud Zones available according to + some defined parameters where an application can be instantiated. + + Definitions of terminologies commonly referred + to throughout the API descriptions. + * __Application Provider__ - The provider of the application that accesses + an Edge Cloud Provider to deploy its application on the Edge Cloud. + An Application Provider may be part of a larger organisation, + like an enterprise, enterprise customer of an Edge Cloud Provider, + or be an independent entity. + * __Application__ - Contains the information about the application to be + instantiated. Descriptor, binary image, charts or any other package + assosiated with the application. The Application Provider request contains + mandatory criteria (e.g. required CPU, memory, storage, bandwidth) defined + in an Application. The Edge Cloud Platform generates a unique ID + for an Application that is ready to be instantiated. + * __Application Instance__ - Is an instance (VM or Container based) running + in an Edge Cloud Zone. The Edge Cloud Platform generates a unique ID + for each instance. + * __Edge Cloud__ - Cloud-like capabilities located at the network edge + including, from the Application Provider's perspective, access to + elastically allocated compute, data storage and network resources, + this access is provided through the Edge Cloud Platform. + * __Edge Cloud Provider__ - Company name of the provider offering the + Edge Services through the Edge Cloud Platform. + Could be an Operator or a Cloud Provider. + * __Edge Cloud Region__ - An Edge Cloud Region is equivalent + to a Region on a Public Cloud. + The higher construct in the hierarchy exposed to an Application + Provider who wishes to deploy an Application on the Edge Cloud and broadly + represents a geography. An Edge CloudRegion typically contains one or + multiple Edge Cloud Zones. + An Edge Cloud Region exists within an Edge Cloud. + * __Edge Cloud Zone__ - An Edge Cloud Zone is the lowest level of + abstraction exposed to an Application Provider who wants to deploy + an Application on Edge Cloud. + Edge Cloud Zones exists within a Edge Cloud Region. + --- + contact: + email: sp-edc@lists.camaraproject.org + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html +externalDocs: + description: Product documentation at Camara + url: https://github.com/camaraproject/EdgeCloud + +servers: + - url: "{apiRoot}/{basePath}" + variables: + apiRoot: + default: http://localhost:443 + description: API root + basePath: + default: edge-application-management/vwip + description: Base path for the Edge Application Management API + +tags: + - name: Application + description: Application and Application Instance Lice Cycle Management + - name: Edge Cloud + description: Edge Cloud Zones Availability + +paths: + /apps: + post: + security: + - openId: + - edge-application-management:apps:write + tags: + - Application + summary: Submit application metadata to the Edge Cloud Provider. + description: | + Contains the information about the application to be + instantiated in the Edge Cloud + operationId: submitApp + parameters: + - $ref: '#/components/parameters/x-correlator' + requestBody: + description: | + The Application Provider request contains mandatory + criteria (e.g. required CPU, memory, storage, bandwidth) and + optional parameters. + content: + application/json: + schema: + $ref: '#/components/schemas/AppManifest' + required: true + responses: + '201': + description: Application created successfully + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/SubmittedApp' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 409 + code: CONFLICT + message: "App already exists" + '500': + $ref: '#/components/responses/500' + '501': + $ref: '#/components/responses/501' + '503': + $ref: '#/components/responses/503' + + /apps/{appId}: + get: + security: + - openId: + - edge-application-management:apps:read + tags: + - Application + summary: Retrieve the information of an Application + description: | + Ask the Edge Cloud Provider the information for a given application + operationId: getApp + parameters: + - $ref: '#/components/parameters/x-correlator' + - name: appId + description: | + A globally unique identifier associated with the + application. + Edge Cloud Provider generates this identifier when the application + is submitted. + in: path + required: true + schema: + $ref: '#/components/schemas/AppId' + responses: + '200': + description: Information of Application + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + type: object + properties: + appManifest: + $ref: '#/components/schemas/AppManifest' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + delete: + security: + - openId: + - edge-application-management:apps:delete + tags: + - Application + summary: | + Delete an Application from an Edge Cloud Provider + description: Delete all the information and content + related to an Application + operationId: deleteApp + parameters: + - $ref: '#/components/parameters/x-correlator' + - name: appId + in: path + description: | + Identificator of the application to be + deleted provided by the Edge Cloud Provider + once the submission was successful + required: true + schema: + $ref: "#/components/schemas/AppId" + responses: + '202': + description: Request accepted + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + '204': + description: App deleted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 409 + code: CONFLICT + message: "App with a running application instance + cannot be deleted" + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + + /apps/{appId}/instances: + post: + security: + - openId: + - edge-application-management:instances:write + tags: + - Application + summary: Instantiation of an Application + description: | + Ask the Edge Cloud Platform to instantiate an application to one + or several Edge Cloud Zones with an Application as an input and an + Application Instance as the output. + operationId: createAppInstance + parameters: + - $ref: '#/components/parameters/x-correlator' + - name: appId + description: | + A globally unique identifier associated with the + application. Edge Cloud Provider generates this identifier when + the application is submitted. + in: path + required: true + schema: + $ref: '#/components/schemas/AppId' + requestBody: + description: Array of Edge Cloud Zone + content: + application/json: + schema: + $ref: '#/components/schemas/AppZones' + required: true + responses: + '202': + description: Application instantiation accepted + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + Location: + description: Contains the URI of the newly created application. + required: true + schema: + type: string + content: + application/json: + schema: + type: object + properties: + appInstaces: + type: array + items: + $ref: '#/components/schemas/AppInstanceInfo' + minItems: 1 + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 409 + code: CONFLICT + message: "Application already instantiated in the given + Edge Cloud Zone or Edge Cloud Region" + '500': + $ref: '#/components/responses/500' + '501': + $ref: '#/components/responses/501' + '503': + $ref: '#/components/responses/503' + get: + security: + - openId: + - edge-application-management:instances:read + tags: + - Application + summary: Retrieve the information of Application Instances for a given App + description: | + Ask the Edge Cloud Provider the information of the instances for a + given application + operationId: getAppInstance + parameters: + - $ref: '#/components/parameters/x-correlator' + - name: appId + description: | + A globally unique identifier associated with + the application. + Edge Cloud Provider generates this identifier when the + application is submitted. + in: path + required: true + schema: + $ref: '#/components/schemas/AppId' + - name: appInstanceId + description: | + A globally unique identifier associated with a running + instance of an application within an specific Edge Cloud Zone. + Edge Cloud Provider generates this identifier. + in: query + required: false + schema: + $ref: '#/components/schemas/AppInstanceId' + - name: region + description: | + Human readable name of the geographical Edge Cloud Region of + the Edge Cloud. Defined by the Edge Cloud Provider. + in: query + required: false + schema: + $ref: '#/components/schemas/EdgeCloudRegion' + responses: + '200': + description: Information of Application Instances + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + type: object + properties: + appInstaceInfo: + type: array + items: + $ref: '#/components/schemas/AppInstanceInfo' + minItems: 1 + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + /apps/{appId}/instances/{appInstanceId}: + delete: + security: + - openId: + - edge-application-management:instances:delete + tags: + - Application + summary: Terminate an Application Instance + description: | + Terminate a running instance of an application within + an Edge Cloud Zone + operationId: deleteAppInstance + parameters: + - $ref: '#/components/parameters/x-correlator' + - name: appId + description: | + A globally unique identifier associated with the + application. Edge Cloud Provider generates this identifier + when the application is submitted. + in: path + required: true + schema: + $ref: '#/components/schemas/AppId' + - name: appInstanceId + in: path + description: | + Identificator of the specific application instance + that will be terminated + required: true + schema: + $ref: "#/components/schemas/AppInstanceId" + responses: + '202': + description: | + Request accepted to be processed. It applies for async + deletion process + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + '204': + description: Application Instance Deleted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + /edge-cloud-zones: + get: + security: + - openId: + - edge-application-management:edge-cloud-zones:read + tags: + - Edge Cloud + summary: Retrieve a list of the operators Edge Cloud Zones and + their status + description: | + List of the operators Edge Cloud Zones and their + status, ordering the results by location and filtering by + status (active/inactive/unknown) + operationId: getEdgeCloudZones + parameters: + - $ref: '#/components/parameters/x-correlator' + - name: region + description: | + Human readable name of the geographical Edge Cloud Region of + the Edge Cloud. Defined by the Edge Cloud Provider. + in: query + required: false + schema: + $ref: '#/components/schemas/EdgeCloudRegion' + - name: status + description: Human readable status of the Edge Cloud Zone + in: query + required: false + schema: + $ref: '#/components/schemas/EdgeCloudZoneStatus' + responses: + '200': + description: | + Successful response, returning the + Available Edge Cloud Zones. + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeCloudZones' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' +components: + securitySchemes: + openId: + description: OpenID Provider Configuration Information. + type: openIdConnect + openIdConnectUrl: https://example.com/.well-known/openid-configuration + parameters: + x-correlator: + name: x-correlator + in: header + description: | + Correlation id for the different services + schema: + type: string + headers: + x-correlator: + description: | + Correlation id for the different services + required: false + schema: + type: string + format: uuid + + schemas: + AccessEndpoint: + type: object + description: | + Application Endpoint for an especific instance that is + running in an specific Edge Cloud Zone. + required: + - port + anyOf: + - required: + - fqdn + - required: + - ipv4Addresses + - required: + - ipv6Addresses + properties: + port: + $ref: '#/components/schemas/Port' + fqdn: + $ref: '#/components/schemas/Fqdn' + ipv4Addresses: + description: IP version 4 of an application instance + type: array + items: + $ref: '#/components/schemas/Ipv4Addr' + minItems: 1 + ipv6Addresses: + description: IP version 6 of an application instance. + type: array + items: + $ref: '#/components/schemas/Ipv6Addr' + minItems: 1 + + AppId: + type: string + format: uuid + description: | + A globally unique identifier associated with the application. + Edge Cloud Platform generates this identifier when the + Application is submitted. + + AppInstanceId: + type: string + format: uuid + description: | + A globally unique identifier associated with a running + instance of an application. + Edge Cloud Platform generates this identifier when the + instantiation in the Edge Cloud Zone is successful. + + AppInstanceInfo: + description: Information about the application instance. + type: object + properties: + appInstanceId: + $ref: '#/components/schemas/AppInstanceId' + status: + description: Status of the application instance (default is 'unknown') + type: string + enum: + - ready + - instantiating + - failed + - terminating + - unknown + default: unknown + componentEndpointInfo: + description: | + Information about the IP and Port exposed by the + Edge Cloud Platform. + Application Client shall use these access points to reach this + application instance + type: array + items: + type: object + required: + - interfaceId + - accessPoints + properties: + interfaceId: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + description: | + This is the interface Identifier that Application Provider + defines when application is being submitted. + accessPoints: + $ref: '#/components/schemas/AccessEndpoint' + minItems: 1 + edgeCloudZone: + $ref: '#/components/schemas/EdgeCloudZone' + + AppZones: + description: | + Collection of Edge Cloud Zones where the Application Provider wants to + instantiate the application. + type: array + items: + $ref: '#/components/schemas/EdgeCloudZone' + minItems: 1 + additionalProperties: false + + AppManifest: + description: | + Application information and requirements provided by the + Application Provider + properties: + name: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{1,63}$ + description: Name of the application. + version: + type: integer + description: Application version information + packageType: + description: Format of the application image package + type: string + enum: + - QCOW2 + - OVA + - CONTAINER + - HELM + operatingSystem: + $ref: '#/components/schemas/OperatingSystem' + appRepo: + description: | + Repository where Application Provider stores the application image + type: object + required: + - type + - imagePath + properties: + type: + type: string + enum: + - PRIVATEREPO + - PUBLICREPO + description: | + Application repository and image URI information. + PUBLICREPO is used of public urls like github, helm repo etc. + PRIVATEREPO is used for private repo managed by the application + developer. Private repo can be accessed by using the app + developer provided userName and password. Password is + recommended to be the personal access token created by developer + e.g. in Github repo. + imagePath: + $ref: '#/components/schemas/Uri' + userName: + type: string + description: | + Username to acces the Helm chart, docker-compose + file or VM image repository + credentials: + type: string + maxLength: 128 + description: | + Password or personal access token created by + developer to acces the app repository. API users can generate + a personal access token e.g. docker clients to use them as + password. + authType: + type: string + enum: + - DOCKER + - HTTP_BASIC + - HTTP_BEARER + - NONE + description: | + The credentials can also be formatted as a Basic + auth or Bearer auth in HTTP "Authorization" header. + checksum: + type: string + description: | + MD5 checksum for VM and file-based images, sha256 + digest for containers + requiredResources: + $ref: '#/components/schemas/RequiredResources' + + componentSpec: + description: | + Information defined in "appRepo" point to the application + descriptor e.g. Helm chart, docker-compose yaml file etc. + The descriptor may contain one or more containers and their + associated meta-data. A component refers to additional details + about these containers to expose the instances of the containers + to external client applications. App provider can define one or + more components (via the associated network port) in componentSpec + corresponding to the containers in helm charts or docker-compose + yaml file as part of app descriptors. + type: array + items: + type: object + required: + - componentName + - networkInterfaces + properties: + componentName: + type: string + description: Component name must be unique with an application + networkInterfaces: + description: | + Each application component exposes some ports + either for external users or for inter component + communication. + Application provider is required to specify which ports are + to be exposed and the type of traffic that will flow through + these ports.The underlying platform may assign a dynamic port + against the "extPort" that the application clients will use + to connect with edge application instance. + type: array + items: + type: object + required: + - interfaceId + - protocol + - port + - visibilityType + properties: + interfaceId: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{3,31}$ + description: | + Each Port and corresponding traffic protocol + exposed by the component is identified by a name. + Application client on user device requires this to + uniquley idenify the interface. + protocol: + type: string + enum: + - TCP + - UDP + - ANY + description: | + Defines the IP transport communication + protocol i.e., TCP, UDP or ANY + port: + type: integer + format: int32 + minimum: 1 + maximum: 65535 + description: | + Port number exposed by the component. + Edge Cloud Provider may generate a dynamic port + towards the component instance which forwards + external traffic to the component port. + visibilityType: + description: | + Defines whether the interface is exposed + to outer world or not i.e., external, or internal. + If this is set to "external", then it is exposed + to external applications otherwise it is exposed + internally to edge application components within + edge cloud. When exposed to external world, + an external dynamic port is assigned for UC traffic + and mapped to the extPort + type: string + enum: + - VISIBILITY_EXTERNAL + - VISIBILITY_INTERNAL + minItems: 1 + required: + - name + - version + - packageType + - appRepo + - requiredResources + - componentSpec + + EdgeCloudProvider: + type: string + description: Human readable name of the Edge Cloud Provider. + + EdgeCloudRegion: + type: string + description: | + Human readable name of the geographical Edge Cloud Region of + the Edge Cloud. Defined by the Edge Cloud Provider. + + EdgeCloudZones: + type: array + items: + $ref: '#/components/schemas/EdgeCloudZone' + minItems: 1 + description: | + A collection of Edge Cloud Zones where the Application Provider can + instantiate an Application Instance. + additionalProperties: false + + EdgeCloudZoneId: + type: string + format: uuid + description: | + Unique identifier created by the Edge Cloud Platform to identify an + Edge Cloud Zone within an Edge Cloud. + + EdgeCloudZone: + type: object + description: | + An Edge Cloud Zone, uniquely identified by a + combination of the value of the Edge Cloud Zone Id object + and the value of the Edge Cloud Provider + object. This value is used to identify an Edge Cloud zone + between Edge Clouds from different Edge Cloud Providers. + properties: + edgeCloudZoneId: + $ref: '#/components/schemas/EdgeCloudZoneId' + edgeCloudZoneName: + $ref: '#/components/schemas/EdgeCloudZoneName' + edgeCloudZoneStatus: + $ref: '#/components/schemas/EdgeCloudZoneStatus' + edgeCloudProvider: + $ref: '#/components/schemas/EdgeCloudProvider' + edgeCloudRegion: + $ref: '#/components/schemas/EdgeCloudRegion' + minItems: 1 + + EdgeCloudZoneName: + type: string + description: | + Human readable name of the geographical zone of + the Edge Cloud. Defined by the Edge Cloud Provider. + + EdgeCloudZoneStatus: + description: Status of the Edge Cloud Zone (default is 'unknown') + type: string + enum: + - active + - inactive + - unknown + default: unknown + + ErrorInfo: + type: object + description: Information about the error + properties: + status: + type: integer + description: HTTP status code returned along with this error response + code: + type: string + description: Code given to this error + message: + type: string + description: Detailed error description + required: + - status + - code + - message + + Fqdn: + type: string + description: | + Full qualified domain name of an application instance + GpuInfo: + type: object + description: Information about the supported GPUs + required: + - gpuMemory + - numGPU + properties: + gpuMemory: + type: integer + description: GPU memory in mega bytes + numGPU: + type: integer + description: Number of GPUs + + Ipv4Addr: + type: string + format: ipv4 + example: "192.168.0.1" + description: | + IP of the device. A single IPv4 address may be specified in + dotted-quad form 1.2.3.4. Only this exact IP number will match the flow + control rule. + + Ipv6Addr: + type: string + format: ipv6 + example: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + description: | + IP of the device. A single IPv6 address, following IETF 5952 + format, may be specified like 2001:db8:85a3:8d3:1319:8a2e:370:7344 + + OperatingSystem: + description: | + Information about the Operating System of the application image + type: object + required: + - architecture + - family + - version + - license + properties: + architecture: + description: Type of the OS Architecture + type: string + enum: + - x86_64 + - x86 + example: x86_64 + family: + description: Family to which OS belongs + type: string + enum: + - RHEL + - UBUNTU + - COREOS + - WINDOWS + - OTHER + version: + description: Version of the OS + type: string + enum: + - OS_VERSION_UBUNTU_2204_LTS + - OS_VERSION_RHEL_8 + - OS_MS_WINDOWS_2022 + - OTHER + license: + description: License needed to activate the OS + type: string + enum: + - OS_LICENSE_TYPE_FREE + - OS_LICENSE_TYPE_ON_DEMAND + - OTHER + + Port: + type: integer + description: Port to stablish the connection + minimum: 0 + RequiredResources: + description: | + Fundamental hardware requirements to be provisioned by the + Application Provider. + type: object + required: + - numCPU + - memory + - storage + properties: + numCPU: + type: integer + description: Number of virtual CPUs + example: 1 + memory: + type: integer + example: 10 + description: Memory in giga bytes + storage: + type: integer + example: 60 + description: Storage in giga bytes + gpu: + type: array + description: Number of GPUs + items: + $ref: '#/components/schemas/GpuInfo' + + SubmittedApp: + description: Information about the submitted app + type: object + properties: + appId: + $ref: '#/components/schemas/AppId' + + Uri: + type: string + example: https://charts.bitnami.com/bitnami/helm/example-chart:0.1.0 + description: | + A Uniform Resource Identifier (URI) as per RFC 3986, + identifies the endpoint within an Edge Cloud Zone where the user + equipment may connect to the selected application instance + + responses: + '400': + description: Bad request + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 400 + code: INVALID_ARGUMENT + message: "Schema validation failed at ..." + '401': + description: Unauthorized + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 401 + code: UNAUTHENTICATED + message: "Authorization failed: ..." + '403': + description: Unauthorized + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 403 + code: PERMISSION_DENIED + message: "Operation not allowed: ..." + '404': + description: Not Found + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 404 + code: NOT_FOUND + message: "Resource does not exist" + '500': + description: Internal Server Error + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 500 + code: INTERNAL + message: "Internal server error: ..." + '501': + description: Not Implemented + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 501 + code: NOT_IMPLEMENTED + message: "Service not implemented" + '503': + description: Service Unavailable + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 503 + code: UNAVAILABLE + message: "Service unavailable" diff --git a/code/API_definitions/README.MD b/code/API_definitions/README.MD deleted file mode 100644 index 7e8dd187..00000000 --- a/code/API_definitions/README.MD +++ /dev/null @@ -1,17 +0,0 @@ -These APIs are contributed by 5GFF: - -# MEC Experience Management and Exposure API -This API allows a developer to: -- discover available MEC platforms, ranked by proximity to a UE. -- read the state (availability and capabilities) of an operator's various MEC platforms. -- register a service profile (a description of the developer's edge service) with the MEC operator -- register the deployed service endpoints with the MEC operator, which allows the closest service endpoint to be discovered at runtime - -The API will also support the following capabilities: -- events(such as change of status of a MEC platform or another event which could affect their service) -- subscription to notification of events. - -Since events and subscription notifications can apply to many CAMARA APIs, that part will be defined in the Commonalities working group to ensure consistency. - -# Simple Discovery API -This API allows a client application to discover the closest MEC platform to the UE hosting the client application. 'Closest' means 'shorteset network path' as that will give the shortest propogation distance, which is a major factor in latency. diff --git a/code/API_definitions/Traffic_Influence.yaml b/code/API_definitions/Traffic_Influence.yaml index 0769e65b..50ca1119 100644 --- a/code/API_definitions/Traffic_Influence.yaml +++ b/code/API_definitions/Traffic_Influence.yaml @@ -1,551 +1,1044 @@ -openapi: 3.0.0 -############################################################################ -# API info # -############################################################################ -info: - title: OPAG-CAMARA Traffic Influence API - version: 0.8.1 - description: | - ## Overview - - The reference scenario foresees a Service owned by a Developer, composed by one or more Service Producers provided by the Developer and deployed in different geographical locations on Telco Operator Edge sites (MEC sites) or in Cloud. The Service Producer, deployed at the Edge, is referred as Edge Application Server (EAS). - The Traffic Influence API provides the fastest routing from the user equipment (e.g. a Smartphone) to the optimal Edge Application Server (EAS) Instance in a specific geographical location, installed in a Telco Operator Edge site. - If a Service is offered by a Cloud Instance and by Edge Instances, the API can be used to route a selected set of users on the Edge Instance. - - ## 1. Introduction - - The Traffic Influence API provides the capability to establish the best connectivity, in terms of latency, in a specific geographical area, between the User Equipment (UE), e.g. the user’s smartphone, and the optimal Edge Application Server instance nearby. - The Service architecture foresees one or more EASs and a component, the Application Function (AF), that is the API consumer. Invoking the TI API, the AF can create a "TrafficInfluence" resource specifying the desired request. - The TI API provider implements the intent specified in the Traffic Influence resource. - While the API is usually invoked to activate the fastest routing for any user, it can also be used to request the routing for a specific user. Invoking the API for each user (using the same "trafficInfluenceID"), the "TrafficInfluence" resource provides the requested routing for a set of users. - - ## 2. Quick Start - The usage of the Traffic Influence API is based on the management of a "TrafficInfluence" resource, an object containing the intent requested invoking the Traffic Influence API and that is implemented by the platform configuring the Mobile Network for the optimal routing toward the EAS Instance. - The "TrafficInfluence" resource can be created (providing the related parameters that specify the desired intent), queried, modified and deleted. - The API is asynchronous, a notification is available providing information about the status of the requested resource. - For an Application (identified by "applicationId") many "TrafficInfluence" resources can be created, e.g. to add multiple users, regions or zones. - - Before starting to use the API, the developer needs to know about the below specified details: - - **Base-Url** - The RESTful Traffic Influence API endpoint, for example [**https://tim-api.developer.tim.it/trafficinfluence**](https://tim-api.developer.tim.it/trafficinfluence) - - **Authentication** - Configure security access keys such as OAuth 2.0 client credentials to be used by Client applications which will invoke the Traffic InfluenceAPI. - - **TrafficInfluence** - This object represents the resource that carries the requirements from the user to be implemented. The Traffic Influence API is invoked for the life cycle management of this resource (CRUD). The resource contains the intents from the API Consumer. Managing this resource, the developer can specify in which geographical location the routing must be applied, toward which application, maybe for a specific set of users or for a limited period pf time. - - **trafficInfluenceID** - Identifier for the Traffic Influence resource. This parameter ir returned by the API and must be used to update it (e.g., adding new users or deleting it) - - **applicationFunctionId** - Unique identifier for the Application Function (AF), the TI API consumer. - - **region** - The developer can specify in which geographical area he requires the fastest routing toward the nearest application instance. A Region is a wide geographical area and it contains one ore more Zones. A Zone is where the Edge Datacenters are located. Zones and Regions identifiers are defined and provided by the Telco Operator and can also be used or retrieved with other CAMARA APIs ("MEC Exposure & Experience Management API" and "Simple Edge Discovery"). To add more regions the API must be invoked (PUT) of each region. New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Application (identified by "applicationId"). - - **zone** - The developer can specify in which geographical area he requires the fastest routing toward the nearest application instance. A Zone is a smaller geographical area inside a Region. A Zone is where the Edge Datacenters are located. To add more zones the API must be invoked (PUT) of each zone. New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Application (identified by "applicationId"). - - **applicationId** - Unique Application identifier inside the Telco Operator Platform. - - **trafficFilters** - The Application can expose different service on different interfaces, with this parameter it is possible to enable just some of those services maybe for different sets of users. - - **usersId** - Optionally a user can be provided as an input. To add more users the API must be invoked (PUT) of each user. New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Applicatoin (identified by "applicatoinId"). The routing toward the selected Application Instance is only applied for provided users. - - **Notification URL and token** - Developers have a chance to specify callback URL on which notifications (eg. session termination) regarding the session can be received from the service provider. This is also an optional parameter. - - ## 3. Authentication and Authorization - The Traffic Influence API makes use of the client credentials grant which is applicable for server to server use cases involving trusted partners or clients without any protected user data involved. - In this method the API invoker client is registered as a confidential client with an authorization grant type of client\_credentials [2]. - - ## 4. API Documentation - ## 4.1 Details - - The Traffic Influence (TI) API is consumed by an Application Function (AF) requesting for the fastest routing of the traffic flow from the User Equipments toward an instance of the Edge Application Server (EAS) in a Telco Operator Edge sites (MEC sites). - - When the EAS is onboarded and deployed in the MEC site, the Application is identified with a unique identifier (applicationId). - - Using the application identifier ("applicationId") and specifying a Zone or a Region, the Telco Operator Platform, autonomously identifies the best instance of the EAS toward routing the traffic flow and configures the Mobile Network accordingly to get the fastest routing. - If just the application identifier is used, the Telco Operator Platform identifies all the EAS Instances and activates the optimal routing on the Mobile Network. - If the fastest routing should be available just for a set of users, the API must be invoked for each user also passing the same TrafficInfluce resource identifier ("trafficInfluenceID") - If the Application offers different services on different interfaces a traffic filter based on IP, Port and Protocol can be used. I this way it is also possible to redirect different users to different interfaces. - - Here are some possible intents: - 1) activate the optimal routing for any EAS Instance: the API must be invoked with the applicationId. The Telco Operator Platform identifies all the EAS Instances and activates the optimal routing on the Mobile Network. - 2) activate the optimal routing in a specific Region or Zone: the API must be invoked with the applicationId and the Zones and Regions identifiers. - 3) activate the optimal routing for a specific set of users: the API can also be invoked with a user identifier ("userId"). The same TrafficInfluce resource identifier ("trafficInfluenceID") must be used in each call. - - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0.html - -externalDocs: - description: Product documentation at Camara - url: https://github.com/camaraproject/ - - -############################################################################ -# Security # -############################################################################ -security: - - oAuth2: - - 'edge:traffic-influences:read' - - 'edge:traffic-influences:write' - -############################################################################ -# Servers # -############################################################################ -servers: - - url: "{apiRoot}/{basePath}" - variables: - apiRoot: - default: http://localhost:9091 - description: API root - basePath: - default: ti/v0 - description: Base path for the Traffic Influence API - - - -############################################################################ -# Paths # -############################################################################ -paths: - /traffic-influences: - get: - parameters: - - in: query - name: applicationId - schema: - type: string - description: Not required. Used to select traffic influence resources filtered by applicationId - tags: - - Traffic Influence API GET Operation - summary: Retries existing TrafficInfluence Resources - description: Reads all of the active TrafficInfluence resources owned by the AF authenticated via oAuth2 - operationId: GetTrafficInfluences - responses: - '200': - description: Returns the information about existing TrafficInfluence resources. - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/TrafficInfluence" - "401": - $ref: "#/components/responses/Generic401" - "403": - $ref: "#/components/responses/Generic403" - '500': - $ref: "#/components/responses/GenericError" - "503": - $ref: "#/components/responses/Generic503" - '504': - $ref: "#/components/responses/BackendConnTimeout" - - post: - tags: - - Traffic Influence API POST Operation - summary: Creates a new TrafficInfluence resource - description: Gets in input an object containing the intents from the AF and creates a TrafficInfluence resourse accordingly. The trafficInfluenceID parameter, that is part of the object, must not be valorized when creating a new resource. It is automatically generated by the system and returned the response - operationId: PostTrafficInfluence - requestBody: - description: Describes the request body - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/TrafficInfluence' - - responses: - '201': - description: TrafficInfluence resource created, the related object is returned with the resource ID (TIResource_id) and status (state) valorised, - headers: - Location: - description: Link to the created traffic influence resource - schema: - type: string - description: Link to the created traffic influence resource - content: - application/json: - schema: - $ref: '#/components/schemas/TrafficInfluence' - - '500': - $ref: '#/components/responses/GenericError' - '504': - $ref: '#/components/responses/BackendConnTimeout' - "401": - $ref: "#/components/responses/Generic401" - "403": - $ref: "#/components/responses/Generic403" - "503": - $ref: "#/components/responses/Generic503" - callbacks: - onTrafficInfluenceChanged: - $ref: "#/components/callbacks/onTrafficInfluenceChanged" - /traffic-influences/{TIResource_id}: - parameters: - - name: TIResource_id - in: path - description: Identifier of the specific TrafficInfluence resource to be retrieved, modified or deleted. It is the value used to fill trafficInfluenceID parameter - required: true - schema: - type: string - - get: - summary: read a specific TrafficInfluence resource identified by the TIResource_id value - tags: - - Traffic Influence API GET Operation - responses: - '200': - description: OK. - content: - application/json: - schema: - $ref: '#/components/schemas/TrafficInfluence' - '404': - $ref: '#/components/responses/ResNotFound' - '500': - $ref: '#/components/responses/GenericError' - '504': - $ref: '#/components/responses/BackendConnTimeout' - "401": - $ref: "#/components/responses/Generic401" - "403": - $ref: "#/components/responses/Generic403" - "503": - $ref: "#/components/responses/Generic503" - put: - tags: - - TrafficInfluence API PUT Operation - summary: updates a specific TrafficInfluence resource, identified by the TIResource_id value - description: The resource identified by the TIResource_id value can be modified - operationId: PutTrafficInfluence - requestBody: - description: Describes the request body - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/TrafficInfluence' - responses: - '200': - description: TrafficInfluence resource edited, the related object is returned, the status (state) is updated. - content: - application/json: - schema: - $ref: '#/components/schemas/TrafficInfluence' - headers: - Location: - description: Link to the created traffic influence resource - schema: - type: string - description: Link to the created traffic influence resource - '404': - $ref: '#/components/responses/ResNotFound' - '500': - $ref: '#/components/responses/GenericError' - '504': - $ref: '#/components/responses/BackendConnTimeout' - "401": - $ref: "#/components/responses/Generic401" - "403": - $ref: "#/components/responses/Generic403" - "503": - $ref: "#/components/responses/Generic503" - callbacks: - onTrafficInfluenceChanged: - $ref: "#/components/callbacks/onTrafficInfluenceChanged" - delete: - summary: Delete an existing TrafficInfluence resource - tags: - - TrafficInfluence API Delete Operation - parameters: - - name: callbackUrl - in: query - required: false - description: | - the location where updated data will be sent. Must be network accessible - by the source server - schema: - type: string - format: uri - example: https://my-notification-server.com - responses: - '200': - $ref: '#/components/responses/OkDeleted' - '404': - $ref: '#/components/responses/ResNotFound' - '504': - $ref: '#/components/responses/BackendConnTimeout' - "401": - $ref: "#/components/responses/Generic401" - "403": - $ref: "#/components/responses/Generic403" - "503": - $ref: "#/components/responses/Generic503" - callbacks: - onTrafficInfluenceChanged: - $ref: "#/components/callbacks/onTrafficInfluenceChanged" - -components: - securitySchemes: - oAuth2: - type: oauth2 - description: This API uses OAuth 2 [More info](https://api.example.com/docs/auth) - flows: - clientCredentials: - tokenUrl: 'https://example.com/oauth/token' - scopes: - 'edge:traffic-influences:read': Grant read-only traffic-influences data - 'edge:traffic-influences:write': Grant write access to traffic-influences data - - ####################################################### - # EVENTS/CALLBACKS - ####################################################### - callbacks: - onTrafficInfluenceChanged: - # when data is sent, it will be sent to the `callbackUrl` provided - # when making the subscription PLUS the suffix `/event` - '{$request.body.notificationUri}/event': - post: - requestBody: - description: subscription payload which contains the updated traffic influence instance - content: - application/json: - schema: - $ref: '#/components/schemas/TrafficInfluenceNotification' - responses: - '202': - description: | - Your server implementation should return this HTTP status code - if the data was received successfully - '204': - description: | - Your server should return this HTTP status code if no longer interested - in further updates - ####################################################### - # RESOURCES - ####################################################### - - schemas: - TrafficInfluenceNotification: - type: object - required: - - trafficInfluenceChanged - properties: - trafficInfluenceChanged: - $ref: "#/components/schemas/TrafficInfluence" - - TrafficInfluence: - type: object - properties: - trafficInfluenceID: - type: string - description: Identifier for the Traffic Influence resource. This parameter ir returned by the API and must be used to update it (e.g., adding new users or deleting it) passing it as TIResource_id value in the API call. - applicationFunctionId: - type: string - description: Unique Identifier of the Application Function, the TI API consumer. - applicationId: - type: string - example: "Virtual_Reality_Arena" - description: Unique ID representing the Edge Application - region: - $ref: '#/components/schemas/types_region_Id' - zone: - $ref: '#/components/schemas/types_zone_Id' - userId: - $ref: '#/components/schemas/userId' - state: - type: string - enum: - - 'ordered' - - 'created' - - 'active' - - 'not active' - - 'error' - - 'deleted' - trafficFilters: - type: array - items: - $ref: '#/components/schemas/FlowInfo' - minItems: 1 - description: Identifies IP packet filters. To be used when a the Application needs a traffic flow towards a specific EAS interface - notificationUri: - type: string - description: Defines the callback uri which should be notified in asynchronous way when the state for the requested resources changes (i.e. ordered to activated) - notificationAuthToken: - type: string - description: Authentification token for callback API - required: - - applicationFunctionId - - applicationId - - ####################################################### - # TYPES - ####################################################### - types_zone_Id: - description: | - Unique identifier representing a zone - type: string - additionalProperties: false - - types_region_Id: - description: | - Unique identifier representing a region - type: string - additionalProperties: false - - userId: - description: User equipment identifier, it is composed by a value and a type for that value - type: object - minProperties: 1 - properties: - UEIdentityType: - $ref: "#/components/schemas/types_UEIdentityType" - UEIdentity: - $ref: "#/components/schemas/types_UEIdentity" - - types_UEIdentityType: - description: Type of User Equipment identifier used in `UEIdentity`. - type: string - enum: - - IPAddress - - MSISDN - - IMEI - - MDN - - GPSI - - types_UEIdentity: - description: Identifier value for User Equipment. The type of identifier is defined by the 'UEIdentityType' parameter. - type: string - - FlowInfo: - type: object - properties: - flowId: - type: integer - description: Indicates the IP flow. - flowDescriptions: - type: array - items: - type: string - description: Indicates the packet filters of the IP flow. The source IP is according to the TI API request, any IP (if no userId is provided) or the IP related to userId so it doesn't need to be specified int flowDescription. The protocol is identified by a number as defined by IANA (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml), e.g. 1 (UDP) or 2 (TCP). The destination IP and port must be specified. - example: protocol 1 to 10.98.0.0/24 5060 - minItems: 1 - maxItems: 2 - required: - - flowId - - ###################################################### - # RESPONSES - ####################################################### - ErrResponse: - type: object - properties: - status: - type: string - example: OK - message: - type: string - example: OK - ErrorInfo: - type: object - required: - - code - - message - properties: - code: - type: string - description: Code given to this error - message: - type: string - description: Detailed error description - responses: - ResNotFound: - description: The specified resource was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ErrResponse' - example: - status: ERROR - message: Resource not found - GenericError: - description: An unknow error has occurred - content: - application/json: - schema: - $ref: '#/components/schemas/ErrResponse' - example: - status: ERROR - message: Generic error - BackendConnTimeout: - description: Connection timeout towards backend service has occurred - content: - application/json: - schema: - $ref: '#/components/schemas/ErrResponse' - example: - status: ERROR - message: Backend connection timeout - OkDeleted: - description: The resource has been successfully deleted - content: - application/json: - example: - status: OK - message: Deleted - Generic400: - description: Invalid input - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorInfo" - example: - code: INVALID_INPUT - message: "Schema validation failed at ..." - Generic401: - description: Unauthorized - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorInfo" - example: - code: UNAUTHORIZED - message: "Authorization failed: ..." - Generic403: - description: Forbidden - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorInfo" - example: - code: FORBIDDEN - message: "Operation not allowed: ..." - SessionNotFound404: - description: Session not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorInfo" - example: - code: NOT_FOUND - message: "Session Id does not exist" - Generic503: - description: Service unavailable - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorInfo" - example: - code: SERVICE_UNAVALIBLE - message: "Service unavailable" \ No newline at end of file +--- +openapi: 3.0.3 +############################################################################ +# API info # +############################################################################ +info: + title: Traffic Influence API + version: 0.9.5-wip + description: | + ## Overview + The reference scenario foresees a Service, composed by one or more Service + Producers deployed in different geographical locations on Edge Cloud Zones + (Edge datacentres of Telco Operator) or in Cloud. The Service Producer, + deployed at the Edge, is referred as Edge Application Server (EAS).\ + An Edge Cloud Zone is a platform in the Telco Operator network, offering + network, compute and storage resources to developers. A developer can + deploy and run applications on an Edge Cloud Zone, meaning reduced latency + to end users that are nearby, as the network path is shorter. A network + operator's EdgeCloud may comprise multiple Edge Cloud Zones, each in a + discrete location to bring latency benefits to end users across a country.\ + The operator can help developers know which of the Edge Cloud Zones will + bring the best performance benefit for a given end user and application\. + The Traffic Influence API (TI API) provides the fastest routing from the + user Device (e.g. a Smartphone) to the optimal EAS instance in a specific + geographical location, installed in an Edge Cloud Zone.\ + If a Service is offered by Cloud Instances and by Edge Instances, the TI API + can be used get the optimal routing of the traffic to the Edge Instances, + maybe for a set of users. Getting the optimal routing can be used to improve + latency maybe in combination with other CAMARA APIs such as QoD (Quality On + Demand). Providing the optimal routing is indeed an important step to get + the optimal latency.\ + If the TI API is used to get the best routing at the Edge for a Device in a + geographical location and the Device moves to another geographical location, + the TI API can be invoked to get the optimal routing in the new geographical + location for that Device. + ## Introduction + The TI API provides the capability to establish the best routing, in terms + of latency, in a specific geographical area, between the user Device, e.g. + the user’s smartphone, and the optimal EAS instance nearby. If the Device + moves in a different geographical location where a more suitable EAS + instance is available, the TI API can be invoked to influence the Device + connectivity to get the optimal routing to the that local instance. It is i + mportant to notice that it is a task of the Application invoking the TI API + to detect the changes in the Device location.\ + The generic architecture for the Service can foresee some Cloud instances of + the Application, one or more Edge Instances of the Application. A component + of the Service is the TI API Consumer. This logical component can be + integrated in other components of the Service to invoke the TI API, creating + a "TrafficInfluence" resource specifying the desired intent.\ + The TI API Producer implements the intent specified in the + "TrafficInfluence" resource.\ + While the TI API can be invoked to activate the fastest routing for any + user, it can also be used to request the best routing for a specific user. + Invoking the TI API for each user, many "TrafficInfluence" resources are + created for each user to provide the requested routing for a set of users.\ + The same approach is used for the geographical locations where the influence + of the traffic must be applied. Invoking the TI API without specifying a + geographical area activates the optimal routing toward any EAS instance, + while invoking the TI API specifying a geographical area activates the + optimal routing only toward the EAS instance located closest to that + geographical area.\ + To activate the optimal routing in selected geographical areas, the TI API + must be invoked for each geographical area.\ + The TI API can be used to: + - optimise the routing when Devices need to consume the service provided + by a local EAS Instances. + - affect an already established Device routing when the Device moves + among different geographical locations. When the TI API consumer detects + a Device has entered a geographical location where an EAS instance is + available, it can invoke the TI API to get the optimal routing toward + that EAS instance. + If the Device moves to another geographical location, served by another + EAS instance, the routing might not be optimal anymore for the new EAS + instance. In the case the Application detects a location change, it can + invoke the TI API again to request a new routing optimization toward + the new EAS instance. + ## Quick Start + The usage of the TI API is based on the management of a "TrafficInfluence" + resource, an object containing the intent requested invoking the TI API and + that is implemented by the platform configuring the Mobile Network for the + optimal routing toward the EAS instance.\ + The "TrafficInfluence" resource can be created (providing the related + parameters that specify the desired intent), queried, modified and + deleted.\ + The TI API is asynchronous, a notification is available providing + information about the status of the requested resource. + For an Application (identified by "appId") many "TrafficInfluence" resources + can be created, e.g. to add multiple users, regions or zones.\ + \ + Before starting to use the TI API, the developer needs to know about the + below specified details:\ + \ + **Base-Url:** + The RESTful TI API endpoint, for example + [**https://tim-api.developer.tim.it/trafficinfluence**](https://tim-api.\ + developer.tim.it/trafficinfluence)\ + \ + **TrafficInfluence:** + This object represents the resource that carries the requirements from the + user to be implemented. The TI API is invoked for the life cycle management + of this resource (CRUD). The resource contains the intents from the TI API + Consumer. Managing this resource, the developer can specify in which + geographical location the routing must be applied, toward which application, + maybe for a specific set of users or for a limited period of time.\ + \ + **trafficInfluenceID:** + Identifier for the Traffic Influence resource. This parameter is returned + by the TI API and must be used to update it (e.g., adding a Device or + deleting it). A different Traffic Influence resource must be created for + any Device or Zone or Region. All these resources are related to an + Application identified by "appId".\ + \ + **apiConsumerId:** + Unique identifier for the TI API Consumer.\ + \ + **region:** + The developer can specify in which geographical area he requires the fastest + routing toward the nearest application instance. A "region" is a wide + geographical area and it contains one or more "zones". A "zone" is where the + Edge Cloud Zone is located. Zones and Regions identifiers are defined and + provided by the Telco Operator and can also be used or retrieved with other + CAMARA APIs (“MEC Exposure & Experience Management API” and “Simple Edge + Discovery”). To add more regions the TI API must be invoked (POST) for each + region. New "TrafficInfluence" resources are created (with different + "trafficInfluenceID"). All the created resources are aggregated by the + Application (identified by "appId").\ + \ + **zone:** + The developer can specify in which geographical area he requires the fastest + routing toward the nearest Application instance. A "zone" is a smaller + geographical area inside a "region". A "zone" is where the Edge Cloud Zone + is located.\ + To add more zones the TI API must be invoked (POST) for each "zone". + New "TrafficInfluence" resources are created (with different + "trafficInfluenceID"). All the created resources are aggregated by the + Application (identified by "appId").\ + \ + **appId:** + A globally unique identifier associated with the application. This + identifier is provided during the application onboarding process. + To influence the traffic toward a specific Application. It is the Operator + Platform that detects the appropriate Application instance in the selected + "region" or "zone".\ + \ + **appInstanceId:** + A globally unique identifier generated by the Operator Platform to identify + a specific instance of the Application on a specific zone. To influence a + traffic toward a specific Application instance.\ + \ + **sourceTrafficFilters:** + The traffic can be from a specific application port in the Device.\ + \ + **destinationTrafficFilters:** + The Application can expose different service on different interfaces, + identified by port and protocol, with this parameter it is possible to + route the traffic just toward some of those services maybe for different + sets of users.\ + \ + **Device:** + An user Device can be provided as an input. The Device can be identified by + the phone number (phoneNumber), an external identifier + (networkAccessIdentifier) or by its IP Address (Ipv4Address, Ipv6Address) + also specifying a Port. For IP address both the private (as seen from inside + the Device) and the public (as seen over Internet by a server connected to + the Device) can be used. To add more users the TI API must be invoked (POST) + of each user Device. New "TrafficInfluence" resources are created (with + different "trafficInfluenceID"). All the created resources are aggregated by + the Application (identified by "appId"). The routing toward the selected + Application instance is only applied for provided user Devices.\ + \ + **Notification URL and token:** + Developers have a chance to specify call back URL on which notifications + (e.g. session termination) regarding the session can be received from the + service provider. This is also an optional parameter. + ## Authentication and Authorization + CAMARA guidelines defines a set of authorization flows which can grant API + clients access to the API functionality, as outlined in the document + [CAMARA-API-access-and-user-consent.md](https://github.com/camaraproject\ + /IdentityAndConsentManagement/blob/main/documentation/CAMARA-API-access\ + -and-user-consent.md). + Which specific authorization flows are to be used will be determined during + onboarding process, happening between the API Client and the Telco Operator + exposing the API, taking into account the declared purpose for accessing the + API, while also being subject to the prevailing legal framework dictated by + local legislation.\ + It is important to remark that in cases where personal user data is + processed by the API, and users can exercise their rights through mechanisms + such as opt-in and/or opt-out, the use of 3-legged access tokens becomes + mandatory. This measure ensures that the API remains in strict compliance + with user privacy preferences and regulatory obligations, upholding the + principles of transparency and user-centric data control. + ## API Documentation + The TI API is consumed by an Application Function (AF) requesting for the + optimal routing, in term of latency, for the traffic flow from a Device + toward EAS instances in Edge Cloud Zones.\ + When the Application (the EAS) is onboarded and deployed in the Edge Cloud + Zones, the Application is identified with a unique identifier ("appId").\ + Using the application identifier ("appId") and specifying a Zone or a Region + the Telco Operator Platform, autonomously identifies the best instance of + the EAS toward which routing the traffic flow and configures the Mobile + Network accordingly to get the fastest routing.\ + If just the application identifier is used, the Telco Operator Platform + identifies all the EAS Instances and activates the optimal routing on the + Mobile Network.\ + If the optimal routing in term of latency should be available just for a set + of users, the TI API must be invoked for each user creating a new + TrafficInfluce resource for each one. + If the Application offers different services on different interfaces a + traffic filter based on IP, Port and Protocol can be used. I this way it is + also possible to redirect different users to different interfaces. + Here are some possible intents: + 1) activate the optimal routing for any EAS instance: the TI API must be + invoked with the "appId". The Telco Operator Platform identifies all the EAS + instances and activates the optimal routing on the Mobile Network. + 2) activate the optimal routing in a specific Region or Zone: the TI API + must be invoked with the "appId" and the Zones and Regions identifiers. + 3) activate the optimal routing for a user devices: the TI API can be + invoked with a user Device identifier (“Device”). For each user Device, + a TI API invocation is required. + ## Release Notes + The Traffic Influence API reduces the complexity of the 3GPP Traffic + Influence API exposed by the 3GPP Network Exposure Function (NEF) [1]. While + the 3GPP TI API offers fastest routing activation and user mobility among + different edge sites, this version of the CAMARA Traffic Influence API + covers only the fastest routing activation, also for selected users. + User mobility will be introduced in a future version.\ + \ + **Enhancements with respect to the previous release V0.8.1:** + - These release also effects existing data sessions + - These release can be also used to optimize existing data sessions when a + Device moves among geographical areas. + - The ueId parameter is renamed into Device + - The parameter Device, that identifies the User, is now simplified to + guarantee the identification of an existing data session + - InstanceId added + - TrafficFilters description updated + - CAMEL type adopted + - FlowInfo deleted + - OpenAPI version updated to 3.0.3 + - To let the Developer to just work on parameters actually editable, the PUT + method is changed into a PATCH method with a limitation on the + parameters usable and modifiable. A new resource is created, + PatchTrafficInfluence that contains only the editable parameters + The same approach is also adopted for the PUT method and a new resource + PostTrafficInfluence was created with just the editable parameters + - DELETE response code modified as 202. The Deletion request is accepted + (not yet completed, it must be carried on by the system) + - Added response code 400 (bad request) to POST + - General improvement in documentation + - applicationId changed into appId and instanceId changed into appInstanceId + - Alignement of parameters with EdgeCloud_LCM: applicationId changed into + appId and instanceId changed into appInstanceId + - Modified reference to CAMARA Authorization guidelines link + - Telco Edge Site changed in Edge Cloud Zone + - Added: info-contact + - Device: IPV4 and IPV6 changed to represent just one IP. Netmask is no more + valid + - Global tags definition + - Adopted lowerCamelCase for OperationId + - Added descriptions for Delete and Get (for specific resource) methods + - Added missing operationid + - Improvement of callback definition + - Added "description" to the TrafficInfluence resource + - Added "description" to the PatchTrafficInfluence resource + - Added "description" to TrafficInfluenceNotification + - Added "description" to NetworkAccessIdentifier + - Added "description" to ErrResponse + - Added "description" to message + - Added "description" to status + - Added "description" to ErrorInfo + - Removed unused error code SessionNotFound404 + - Alignement of parameters with EdgeCloud_LCM: applicationId changed into + appId and instanceId changed into appInstanceId + - Adoption of OpenId authentication for Consent Management. Client + Credential is removed + - Intruduced xcorrelator + - General alignment with CAMARA on returned Errors + - Modified CAMARA URL to refer to the Edge Cloud Repository + - OAS version now includes "-wip" extension + - simplified "Servers" section and included "vwip" as version + - Updated documentation to better specify how to identify a Device + - Updated the Device parameter according to CAMARA_common.yaml + - change API name in YAML + - introduced sourceTrafficFilters and modified trafficFilters into + destinationTrafficFilters + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + contact: + email: project-email@sample.com + +externalDocs: + description: Product documentation at Camara + url: https://github.com/camaraproject/EdgeCloud +############################################################################ +# Servers # +############################################################################ +servers: + - url: "{apiRoot}/traffic-influence/vwip" + variables: + apiRoot: + default: http://localhost:9091 + description: API root for the Traffic Influence API +############################################################################ +# Tags # +############################################################################ +tags: + - name: Traffic Influence API read + description: Reads existing TrafficInfluence resources + - name: Traffic Influence API write + description: Creates of modifies a TrafficInfluence resource +############################################################################ +# Paths # +############################################################################ +paths: + /traffic-influences: + get: + security: + - openId: + - 'traffic-influence:traffic-influences:read' + parameters: + - $ref: '#/components/parameters/x-correlator' + - in: query + name: appId + schema: + $ref: "#/components/schemas/AppId" + description: Used to select traffic influence resources filtered by + appId + tags: + - Traffic Influence API read + summary: Retries existing TrafficInfluence Resources + description: Reads all of the active TrafficInfluence resources owned by + the same API Consumer + operationId: getTrafficInfluence + responses: + '200': + description: Returns the information about existing TrafficInfluence + resources. + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/TrafficInfluence" + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + '500': + $ref: "#/components/responses/GenericError" + "503": + $ref: "#/components/responses/Generic503" + '504': + $ref: "#/components/responses/BackendConnTimeout" + post: + tags: + - Traffic Influence API write + summary: Creates a new TrafficInfluence resource + description: Takes as input an object containing the intents from the API + Consumer and creates a TrafficInfluence resourse accordingly. The + trafficInfluenceID parameter, that is part of the object, must not be + valorized when creating a new resource. For this reason the + trafficInfluenceID parameter must be avoided in the object, anyway it + will be ignored by the API Producer. It is automatically generated by + the system and returned in the response. + operationId: postTrafficInfluence + parameters: + - $ref: '#/components/parameters/x-correlator' + security: + - openId: + - 'traffic-influence:traffic-influences:write' + requestBody: + description: Describes the request body + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrafficInfluence' + responses: + '201': + description: TrafficInfluence resource created, the related object is + returned with the resource ID (trafficInfluenceID) and status (state) + valorised. + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + Location: + description: Link to the created traffic influence resource + schema: + type: string + description: Link to the created traffic influence resource + content: + application/json: + schema: + $ref: '#/components/schemas/TrafficInfluence' + "400": + $ref: "#/components/responses/Generic400" + '500': + $ref: '#/components/responses/GenericError' + '504': + $ref: '#/components/responses/BackendConnTimeout' + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "503": + $ref: "#/components/responses/Generic503" + callbacks: + onTrafficInfluenceChanged: + $ref: "#/components/callbacks/onTrafficInfluenceChanged" + /traffic-influences/{trafficInfluenceID}: + parameters: + - name: trafficInfluenceID + in: path + description: Identifier of the specific TrafficInfluence resource to be + retrieved, modified or deleted. It is the value used to fill + trafficInfluenceID parameter. + required: true + schema: + type: string + get: + tags: + - Traffic Influence API read + summary: Reads a specific TrafficInfluence resource identified by the + trafficInfluenceID value. + description: Returns a specific TrafficInfluence resources owned by the + same API Consumer. + operationId: getAllTrafficInfluences + parameters: + - $ref: '#/components/parameters/x-correlator' + security: + - openId: + - 'traffic-influence:traffic-influences:read' + responses: + '200': + description: OK. + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/TrafficInfluence' + '404': + $ref: '#/components/responses/ResNotFound' + '500': + $ref: '#/components/responses/GenericError' + '504': + $ref: '#/components/responses/BackendConnTimeout' + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "503": + $ref: "#/components/responses/Generic503" + patch: + tags: + - Traffic Influence API write + summary: updates a specific TrafficInfluence resource, identified by the + trafficInfluenceID value. + description: The resource identified by the trafficInfluenceID value can + be modified. + operationId: patchTrafficInfluence + parameters: + - $ref: '#/components/parameters/x-correlator' + security: + - openId: + - 'traffic-influence:traffic-influences:update' + requestBody: + description: Describes the request body + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatchTrafficInfluence' + responses: + '200': + description: TrafficInfluence resource edited, the related object is + returned, the status (state) is updated. + content: + application/json: + schema: + $ref: '#/components/schemas/TrafficInfluence' + headers: + Location: + description: Link to the created traffic influence resource + schema: + type: string + description: Link to the created traffic influence resource + x-correlator: + $ref: '#/components/headers/x-correlator' + "400": + $ref: "#/components/responses/Generic400" + '404': + $ref: '#/components/responses/ResNotFound' + '500': + $ref: '#/components/responses/GenericError' + '504': + $ref: '#/components/responses/BackendConnTimeout' + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "503": + $ref: "#/components/responses/Generic503" + callbacks: + onTrafficInfluenceChanged: + $ref: "#/components/callbacks/onTrafficInfluenceChanged" + delete: + tags: + - Traffic Influence API write + summary: Delete an existing TrafficInfluence resource + description: invoked by the API Consumer to stop influencing the traffic, + deleting a TrafficInfluence resource previously created. + operationId: deleteTrafficInfluence + security: + - openId: + - 'traffic-influence:traffic-influences:delete' + parameters: + - $ref: '#/components/parameters/x-correlator' + - name: callbackUrl + in: query + required: false + description: | + the location where updated data will be sent. Must be network + accessible + by the source server + schema: + type: string + format: uri + example: https://my-notification-server.com + responses: + '202': + $ref: '#/components/responses/OkDeletionInProgress' + '404': + $ref: '#/components/responses/ResNotFound' + '504': + $ref: '#/components/responses/BackendConnTimeout' + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "503": + $ref: "#/components/responses/Generic503" + callbacks: + onTrafficInfluenceChanged: + $ref: "#/components/callbacks/onTrafficInfluenceChanged" +############################################################################ +# Components # +############################################################################ +components: + securitySchemes: + openId: + description: to support Consent Management + type: openIdConnect + openIdConnectUrl: https://example.com/.well-known/openid-configuration + + parameters: + x-correlator: + name: x-correlator + in: header + description: Correlation id for the different services. + schema: + type: string + headers: + x-correlator: + description: Correlation id for the different services. + schema: + type: string + ######################################################################### + # Events/Callbacks # + ######################################################################### + callbacks: + onTrafficInfluenceChanged: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/event` + '{$request.body.notificationUri}/event': + post: + tags: + - Traffic Influence CALLBACK Operation + summary: Provides a notifican channel for changes in the + TrafficInfluence resource + description: Creating, modifying or delating a Traffic Influece + resourece is an asycronous task. For this reason a notification + channel via callback to a specified URL is provided. + operationId: postTrafficInfluence + parameters: + - $ref: '#/components/parameters/x-correlator' + requestBody: + description: subscription payload which contains the updated + traffic influence instance + content: + application/json: + schema: + $ref: '#/components/schemas/TrafficInfluenceNotification' + responses: + '202': + description: Your server implementation should return this HTTP + status code if the data was received successfully + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + '204': + description: Your server should return this HTTP status code if + no longer interested in further updates + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + ########################################################################## + # Resources # + ########################################################################## + schemas: + TrafficInfluence: + description: Resource conteining the informations to influence the + traffic from the device to the EAS + type: object + properties: + trafficInfluenceID: + type: string + description: Identifier for the Traffic Influence resource. This + parameter is returned by the API and must be used to update it + (e.g., adding new users or deleting it). + apiConsumerId: + type: string + description: Unique Identifier of the TI API Consumer. + appId: + $ref: '#/components/schemas/AppId' + appInstanceId: + $ref: '#/components/schemas/AppInstanceId' + region: + $ref: '#/components/schemas/TypesRegionId' + zone: + $ref: '#/components/schemas/TypesZoneId' + device: + $ref: '#/components/schemas/Device' + state: + type: string + description: it reports the state of the TrafficInfluence resource. + When first invoked, the resource is 'ordered'. When the platforms + prepares the resource, it is 'created'. When the new routing is + enabled in the network, the state is 'active'. If an error occurs + in the resource creation or in its activation, the state is 'error'. + When the DELETE method is invoked the state is + 'deletion in progress'. + After the resource is deleted (as a consequence of the previous + invokation of the DELETE method) the state is 'deleted'. + enum: + - 'ordered' + - 'created' + - 'active' + - 'error' + - 'deletion in progress' + - 'deleted' + sourceTrafficFilters: + description: Ports used locally by the device for flows to which + the requested traffic influence should apply. If omitted, then the + traffic influence will apply to all flows between the device and the + specified application server address and ports. + type: object + properties: + sourcePort: + allOf: + - $ref: "#/components/schemas/PortsSpec" + destinationTrafficFilters: + description: Identifies the destination IP packet filters. To be + used when it is needed a traffic flow towards a specific EAS + interface identified by a protocol and a port. Also the Protocol + (e.g. TCP or UDP) can be specified. + type: object + properties: + destinationPort: + allOf: + - $ref: "#/components/schemas/PortsSpec" + destinationProtocol: + allOf: + - $ref: "#/components/schemas/Protocol" + notificationUri: + type: string + description: Defines the callback uri which should be notified in + asynchronous way when the state for the requested resources changes + (i.e. ordered to activated) + notificationAuthToken: + type: string + description: Authentification token for callback API + required: + - apiConsumerId + - appId + PatchTrafficInfluence: + description: inherits from TrafficInfluence and restricts the access to + certain parameters. + Only some paramter can be indeed modified with the PATCH operation. + allOf: + - $ref: "#/components/schemas/TrafficInfluence" + properties: + trafficInfluenceID: + readOnly: true + apiConsumerId: + readOnly: true + appId: + readOnly: true + state: + readOnly: true + PostTrafficInfluence: + allOf: + - $ref: "#/components/schemas/TrafficInfluence" + properties: + trafficInfluenceID: + readOnly: true + state: + readOnly: true + TrafficInfluenceNotification: + type: object + description: Notifican channel for changes in the TrafficInfluence + resource + required: + - trafficInfluenceChanged + properties: + trafficInfluenceChanged: + $ref: "#/components/schemas/TrafficInfluence" + ######################################################################## + # Types # + ######################################################################## + TypesZoneId: + description: Unique identifier representing a zone + type: string + additionalProperties: false + TypesRegionId: + description: | + Unique identifier representing a region + type: string + additionalProperties: false + Device: + description: | + End-user equipment able to connect to a mobile network. Examples of + devices include smartphones or IoT sensors/actuators. + The developer can choose to provide the below specified device + identifiers: + * `ipv4Address` + * `ipv6Address` + * `phoneNumber` + * `networkAccessIdentifier` + NOTE: the MNO might support only a subset of these options. The API + invoker can provide multiple identifiers to be compatible across + different MNOs. In this case the identifiers MUST belong to the same + device. + type: object + properties: + phoneNumber: + $ref: "#/components/schemas/PhoneNumber" + networkAccessIdentifier: + $ref: "#/components/schemas/NetworkAccessIdentifier" + ipv4Address: + $ref: "#/components/schemas/DeviceIpv4Addr" + ipv6Address: + $ref: "#/components/schemas/DeviceIpv6Address" + minProperties: 1 + PhoneNumber: + description: A public identifier addressing a telephone subscription. In + mobile networks it corresponds to the MSISDN (Mobile Station + International Subscriber Directory Number). In order to be globally + unique it has to be formatted in international format, according to + E.164 standard, prefixed with '+'. + type: string + pattern: '^\+[1-9][0-9]{4,14}$' + example: "+123456789" + NetworkAccessIdentifier: + description: A public identifier addressing a subscription in a mobile + network. In 3GPP terminology, it corresponds to the GPSI formatted with + the External Identifier ({Local Identifier}@{Domain Identifier}). + Unlike the telephone number, the network access identifier is not + subjected to portability ruling in force, and is individually managed + by each operator. + type: string + example: "123456789@domain.com" + DeviceIpv4Addr: + type: object + description: | + The device should be identified by either the public (observed) IP + address and port as seen by the application server, or the private + (local) and any public (observed) IP addresses in use by the device + (this information can be obtained by various means, for example from + some DNS servers). + If the allocated and observed IP addresses are the same (i.e. NAT is not + in use) then the same address should be specified for both + publicAddress and privateAddress. + If NAT64 is in use, the device should be identified by its publicAddress + and publicPort, or separately by its allocated IPv6 address (field + ipv6Address of the Device object) + In all cases, publicAddress must be specified, along with at least one + of either privateAddress or publicPort, dependent upon which is known. + In general, mobile devices cannot be identified by their public IPv4 + address alone. + properties: + publicAddress: + $ref: "#/components/schemas/SingleIpv4Addr" + privateAddress: + $ref: "#/components/schemas/SingleIpv4Addr" + publicPort: + $ref: "#/components/schemas/Port" + anyOf: + - required: [publicAddress, privateAddress] + - required: [publicAddress, publicPort] + example: + publicAddress: "84.125.93.10" + publicPort: 59765 + SingleIpv4Addr: + description: A single IPv4 address with no subnet mask + type: string + format: ipv4 + example: "84.125.93.10" + PortsSpec: + description: Specification of several TCP or UDP ports + type: object + minProperties: 1 + properties: + ranges: + description: Range of TCP or UDP ports + type: array + minItems: 1 + items: + type: object + required: + - from + - to + properties: + from: + $ref: "#/components/schemas/Port" + to: + $ref: "#/components/schemas/Port" + Port: + description: TCP or UDP port number + type: integer + minimum: 0 + maximum: 65535 + Protocol: + description: The protocol for the influeced flow. It can be specified and + it is identified by a string according to the column “Keyword” as defined + by IANA (https://www.iana.org/assignments/protocol-numbers/\ + protocol-numbers.xhtml), e.g. UDP or TCP. + type: string + example: "TCP" + DeviceIpv6Address: + description: | + The device should be identified by the observed IPv6 address, or by any + single IPv6 address from within the subnet allocated to the device + (e.g. adding ::0 to the /64 prefix). + type: string + format: ipv6 + example: 2001:db8:85a3:8d3:1319:8a2e:370:7344 + AppInstanceId: + type: string + format: uuid + description: A globally unique identifier associated with a running + instance of an application. OP generates this identifier. + AppId: + type: string + format: uuid + example: "6B29FC40-CA47-1067-B31D-00DD010662DA" + description: A globally unique identifier associated with theapplication. + OP generates this identifier when the application is submitted over NBI. + ######################################################################## + # Responses # + ######################################################################## + ErrResponse: + description: Responce feedback in case of errors + type: object + properties: + status: + description: status for the error + type: string + example: OK + message: + description: additional message for the error + type: string + example: OK + ErrorInfo: + description: Information in case of error + type: object + required: + - code + - message + properties: + code: + type: string + description: Code given to this error + message: + type: string + description: Detailed error description + responses: + ResNotFound: + description: The specified resource was not found + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrResponse' + example: + status: ERROR + message: Resource not found + GenericError: + description: An unknow error has occurred + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrResponse' + example: + status: ERROR + message: Generic error + BackendConnTimeout: + description: Connection timeout towards backend service has occurred + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrResponse' + example: + status: ERROR + message: Backend connection timeout + OkDeletionInProgress: + description: The resource delation request has been accepted + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrResponse' + example: + status: OK + message: Accepted + Generic400: + description: Problem with the client request + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 400 + code: INVALID_ARGUMENT + message: Client specified an invalid argument, request body or query + param + Generic401: + description: Authentication problem with the client request + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 401 + code: UNAUTHENTICATED + message: Request not authenticated due to missing, invalid, or + expired credentials + Generic403: + description: Client does not have sufficient permission + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + examples: + PermissionDenied: + value: + status: 403 + code: PERMISSION_DENIED + message: Client does not have sufficient permissions to perform + this action + InvalidTokenContext: + value: + status: 403 + code: INVALID_TOKEN_CONTEXT + message: Phone number cannot be deducted from access token + context + Generic404: + description: The specified resource was not found + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 404 + code: CALL_FORWARDING.UNKNOWN_PHONE_NUMBER + message: Call forwarding check can't be done because the phone + number is unknown. + Generic500: + description: Server error + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 500 + code: INTERNAL + message: Server error + Generic503: + description: Service unavailable. Typically the server is down + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 503 + code: UNAVAILABLE + message: Service unavailable + Generic504: + description: Request time exceeded. If it happens repeatedly, consider + reducing the request complexity. + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorInfo' + example: + status: 504 + code: TIMEOUT + message: Request timeout exceeded. Try later diff --git a/code/API_definitions/simple_edge_discovery.md b/code/API_definitions/simple_edge_discovery.md new file mode 100644 index 00000000..b2937bed --- /dev/null +++ b/code/API_definitions/simple_edge_discovery.md @@ -0,0 +1 @@ +Simple Edge Discovery code has now moved to its own repository: [Simple Edge Discovery](https://github.com/camaraproject/SimpleEdgeDiscovery) diff --git a/code/API_definitions/simple_edge_discovery.yaml b/code/API_definitions/simple_edge_discovery.yaml deleted file mode 100644 index d60d8e25..00000000 --- a/code/API_definitions/simple_edge_discovery.yaml +++ /dev/null @@ -1,406 +0,0 @@ -openapi: 3.0.0 -info: - title: Simple MEC Discovery API - version: 1.1.2 - description: | - # Find your nearest MEC platform - --- - Network operators will typically have multiple MEC sites in a given territory. Connecting your application to a server on the closest MEC platform means the lowest latency - however, the physical location of a user is not an accurate match to the closest MEC site, due to the way operator networks are configured. This API returns the MEC platforms with the _shortest network path_ to the client making the request, and hence the lowest propagation delay. - * If you have a server instance deployed there, connect to it to gain the lowest latency - * Or if not, you may wish to deploy an instance there using the APIs of the cloud provider supporting that zone. - - This API is intended to be called by a client application hosted on a UE attached to the operator network. _Note that the API parameters have been listed in this 'simple API' to align with the full API, but are optional and may not be supported by the API server_ - --- - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -servers: - # Added by API Auto Mocking Plugin - - description: SwaggerHub API Auto Mocking - url: https://virtserver.swaggerhub.com/alphatest/SimpleAPI/1.1.2 - -tags: - - name: Discovery - description: | - Find the closest MEC platform to the UE (user equipment) - -paths: - /: - get: - responses: - '200': - description: Bookmark - content: - application/json: - schema: - title: getResourcesResponse - type: object - properties: - resources: - type: array - items: - $ref: '#/components/schemas/resources' - links: - type: array - items: - oneOf: - - $ref: '#/components/schemas/linksCommon' - '401': - $ref: '#/components/responses/Unauthorized' - default: - $ref: '#/components/responses/Unexpected' - tags: - - Discovery - operationId: bookmark - summary: API bookmark - description: API bookmark - - /mecplatforms: - get: - operationId: get-mecplatforms - parameters: - - $ref: '#/components/parameters/region' - - $ref: '#/components/parameters/zone' - - $ref: '#/components/parameters/serviceProfileId' - - $ref: '#/components/parameters/subscriberDensity' - - $ref: '#/components/parameters/UEIdentityType' - - $ref: '#/components/parameters/UEIdentity' - responses: - '200': - description: MEC platforms matching query parameters - content: - application/json: - schema: - title: GetMECPlatformsResponse - type: object - properties: - MECPlatforms: - type: array - items: - $ref: '#/components/schemas/resources_mecplatform' - links: - type: array - items: - oneOf: - - $ref: '#/components/schemas/links_All-mec-platforms' - - $ref: '#/components/schemas/linksCommon' - '401': - $ref: '#/components/responses/Unauthorized' - default: - $ref: '#/components/responses/Unexpected' - tags: - - Discovery - summary: Returns the name of the closest MEC platform(s) to the UE that sent the request. - description: ON receiving this request, the network will calculate which of its MEC platforms have the shortest network path to the UE (terminal) from which the request was made. - -components: - schemas: - resources: - type: array - items: - oneOf: - - $ref: '#/components/schemas/links_All-mec-platforms' - additionalProperties: false - resources_mecplatform: - type: object - properties: - ern: - $ref: '#/components/schemas/types_edgeResource' - zone: - $ref: '#/components/schemas/types_zone_Id' - region: - $ref: '#/components/schemas/types_region_Id' - status: - description: Status of the MEC Platform (default is 'unknown') - type: string - enum: - - active - - inactive - - unknown - default: unknown - properties: - type: array - items: - type: object - properties: - type: - type: string - data: - type: object - additionalProperties: false - - types_edgeResource: - description: | - An object defined by the service provider representing an edge resource within its network domain, such as a MEC Platform. The string contains colon-separated metadata in the form ern::::: - type: string - additionalProperties: false - types_zone_Id: - description: | - Unique identifier representing a zone - type: string - additionalProperties: false - types_region_Id: - description: | - Unique identifier representing a region - type: string - additionalProperties: false - typesError: - type: object - properties: - code: - type: string - message: - type: string - links: - $ref: '#/components/schemas/linksCommon' - required: - - code - - message - - links - additionalProperties: false - types_success: - type: object - properties: - code: - type: string - message: - type: string - links: - $ref: '#/components/schemas/linksCommon' - required: - - code - - message - - links - additionalProperties: false - types_error: - type: object - properties: - code: - type: string - message: - type: string - links: - $ref: '#/components/schemas/linksCommon' - required: - - code - - message - - links - additionalProperties: false - types_UEIdentityType: - description: Type of User Equipment identifier used in `UEIdentity`. - type: string - enum: - - IPAddress - - MSISDN - - IMEI - - MDN - - GPSI - types_UEIdentity: - description: Identifier value for User Equipment. The type of identifier is defined by the 'UEIdentityType' parameter. - type: string -########################################### -# LINKS -########################################### - links_All-mec-platforms: - type: object - readOnly: true - properties: - link: - type: object - properties: - rel: - type: string - pattern: ListMECPlatforms - example: ListMECPlatforms - method: - type: string - pattern: get - example: get - href: - type: string - pattern: '\/mecplatforms' - example: /mecplatforms - required: - - href - - rel - - method - additionalProperties: false - - linksSelf: - type: object - readOnly: true - properties: - link: - type: object - properties: - rel: - type: string - pattern: self - example: self - method: - type: string - pattern: get - example: get - href: - type: string - format: uri - required: - - href - - rel - - method - additionalProperties: false - linksVersionHistory: - type: object - readOnly: true - properties: - link: - type: object - properties: - rel: - type: string - pattern: version-history - example: version-history - method: - type: string - pattern: get - example: get - href: - type: string - format: uri - required: - - href - - rel - - method - additionalProperties: false - linksTermsOfService: - type: object - readOnly: true - properties: - link: - type: object - properties: - rel: - type: string - pattern: terms-of-service - example: terms-of-service - method: - type: string - pattern: get - example: get - href: - type: string - format: uri - required: - - href - - rel - - method - additionalProperties: false - linksBookmark: - type: object - readOnly: true - properties: - link: - type: object - properties: - rel: - type: string - pattern: bookmark - example: bookmark - method: - type: string - pattern: get - example: get - href: - type: string - format: uri - required: - - href - - rel - - method - additionalProperties: false - linksCommon: - type: array - readOnly: true - items: - oneOf: - - $ref: '#/components/schemas/linksSelf' - - $ref: '#/components/schemas/linksVersionHistory' - - $ref: '#/components/schemas/linksTermsOfService' - - $ref: '#/components/schemas/linksBookmark' - -################################### -# RESPONSES -#################################### - responses: - OK: - description: HTTP 200 OK - content: - application/json: - schema: - $ref: '#/components/schemas/types_success' - Unauthorized: - description: HTTP 401 Unauthorized - content: - application/json: - schema: - $ref: '#/components/schemas/types_error' - NotFound: - description: HTTP 404 The specified resource was not found - content: - application/json: - schema: - $ref: '#/components/schemas/types_error' - Unexpected: - description: HTTP 500 Internal Server Error - content: - application/json: - schema: - $ref: '#/components/schemas/typesError' - -################################ -# PARAMETERS -################################ - - parameters: - region: - name: region - description: MEC region ID - in: query - required: false - schema: - type: string - zone: - name: zone - description: MEC zone ID - in: query - required: false - schema: - type: string - serviceProfileId: - name: serviceProfileId - description: service profile identifier - in: query - required: false - schema: - type: string - subscriberDensity: - name: subscriberDensity - description: Minimum number of 4G/5G subscribers per square kilometer. - in: query - required: false - schema: - type: integer - UEIdentityType: - name: UEIdentityType - description: Type of User Equipment identifier used in `UEIdentity`. - in: query - required: false - schema: - $ref: '#/components/schemas/types_UEIdentityType' - UEIdentity: - name: UEIdentity - description: Identifier value for User Equipment. The type of identifier is defined by the UEIdentityType parameter. - in: query - required: false - schema: - $ref: '#/components/schemas/types_UEIdentity' diff --git a/code/Test_definitions/Edgecloud_LCM_Test.feature b/code/Test_definitions/Edgecloud_LCM_Test.feature new file mode 100644 index 00000000..a06df0bc --- /dev/null +++ b/code/Test_definitions/Edgecloud_LCM_Test.feature @@ -0,0 +1,134 @@ +#/*- ---license-start +#* CAMARA Project +#* --- +#* Copyright (C) 2022 - 2023 Contributors | Deutsche Telekom AG to CAMARA a Series of LF Projects, LLC +#* The contributor of this file confirms his sign-off for the +#* Developer Certificate of Origin (http://developercertificate.org). +#* --- +#* 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. +#* ---license-end +#*/ + +@EdgeCloudLCM @EdgeCloudLCMSanity +Feature:Automated Edge Cloud API System Integration Test + + +@EdgeCloud_LCM_app_submittion_ok +Scenario: Submit an Application with mandatory parameters +When invoking with the POST method to submit an app with all required parameters +Then response code is 201 + +@EdgeCloud_LCM_app_submittion_conflict +Scenario: Submit an Application with mandatory parameters +Given an aplication with the same name and version had already been submitted +When invoking with the POST method to submit an app with all required parameters +Then response code is 409 + +@EdgeCloud_LCM_app_get_info_valid_parameter +Scenario: Get application info with mandatory parameter ("appId") +When invoking the GET method to obtain app information with mandatory parameter ("appId") +Then response code is 200 + +@EdgeCloud_LCM_app_get_info_invalid_parameter +Scenario: Get application info with mandatory parameter ("appId") +Given appId provided does not exist +When invoking the GET method to obtain submittion app information with mandatory parameter ("appId") +Then response code is 404 + +@EdgeCloud_LCM_app_delete_valid_parameter +Scenario: Delete all the information and content related to an Application with mandatory parameter ("appId") +Given there are no running instances of the app +When invoking with the DELETE method to delete an app with just mandatory parameter ("appId") +Then response code is 202 +And the application information is deleted + +@EdgeCloud_LCM_app_delete_conflict +Scenario: Delete all the information and content related to an Application with mandatory parameter ("appId") +Given there are running instances of the app +When invoking with the DELETE method to delete an app with just mandatory parameter ("appId") +Then response code is 409 + +@EdgeCloud_LCM_app_delete_invalid_parameter +Scenario: Delete all the information and content related to an Application with mandatory parameter ("appId") +Given appId provided does not exist +When invoking with the DELETE method to delete an app with just mandatory parameter ("appId") +Then response code is 404 + +@EdgeCloud_LCM_app_instantiation_ok_mandatory_parameters +Scenario: Instantiate an Application with just mandatory parameters ("appId" in path, and "region" in body) +Given an aplication has already been submitted +When invoking with the POST method to instantiate an app with just mandatory parameters ("appId" in path, and "region" in body) +Then response code is 202 +And the process of instantiating the app starts in all available edge cloud zones in the region provided + +@EdgeCloud_LCM_app_instantiation_ok_optional_parameters +Scenario: Instantiate an Application with mandatory parameters ("appId" in path, and "region" in body) and optional parameter ("EdgeCloudZone") +Given an aplication has already been submitted +When invoking with the POST method to instantiate an app with mandatory mandatory parameters ("appId" in path, and "region" in body) and optional parameter ("EdgeCloudZone") +Then response code is 202 +And the process of intantiating the app starts only in given region and edge cloud zone + +@EdgeCloud_LCM_app_instantiation_conflict +Scenario: Instantiate an Application with mandatory parameters ("appId" in path, and "region" in body) and optional parameter ("EdgeCloudZone") +Given an aplication has already been submitted, but already instantiated in given EdgeCloudZone +When invoking with the POST method to instantiate an app with mandatory mandatory parameters ("appId" in path, and "region" in body) and optional parameter ("EdgeCloudZone") +Then response code is 409 + +@EdgeCloud_LCM_app_instance_get_info_valid_parameter +Scenario: Get application instance info with mandatory parameter ("appId") +When invoking the GET method to obtain information an app instance with mandatory parameter ("appId") +Then response code is 200 +And information of all existing app instances of given app is returned + +@EdgeCloud_LCM_app_instance_get_info_invalid_parameter +Scenario: Get application instance info with mandatory parameter ("appId") +Given appId provided does not exist +When invoking the GET method to obtain information an app instance with mandatory parameter ("appId") +Then response code is 404 + +@EdgeCloud_LCM_app_innstance_delete_all_instances +Scenario: Delete all running instances of an application in Edge Cloud +When invoking with the DELETE method to terminate running instances of an application within Edge Cloudwith with just mandatory parameter ("appId") +Then response code is 202 +And all the application instances termination initiated + +@EdgeCloud_LCM_app_innstance_delete_valid_parameter +Scenario: Delete a running instance of an application within an Edge Cloud Zone with optional parameter ("appInstanceId") +When invoking with the DELETE method to terminate a running instance of an application including optional parameter ("appInstanceId") and mandatory parameter ("appId") +Then response code is 202 +And the application instance termination initiated + + +@EdgeCloud_LCM_app_innstance_delete_invalid_parameter +Scenario: Delete a running instance of an application within an Edge Cloud Zone with optional parameter ("appInstanceId") +Given appInstanceId provided does not exist +When invoking with the DELETE method to terminate a running instance of an application including optional parameter ("appInstanceId") and mandatory parameter ("appId") +Then response code is 404 + +@EdgeCloud_LCM_get_all_edge_cloud_zones_ok +Scenario: Get information of all existing Edge Cloud Zones +When invoking the GET method to obtain information of Edge Cloud Zones with no optional parameters +Then response code is 200 +And information of all existing edge cloud zones is returned + +@EdgeCloud_LCM_get_filtered_edge_cloud_zones_ok +Scenario: Get information of existing Edge Cloud Zones with optional parameters ("region","status") +When invoking the GET method to obtain information of Edge Cloud Zones with a region and a status (active,inactive,unknown) +Then response code is 200 +And only information of cloud zones in the region and with the current status given in the input is returned + +@EdgeCloud_LCM_get_filtered_edge_cloud_zones_nok +Scenario: Get information of existing Edge Cloud Zones with optional parameters ("region","status") +Given region provided that not exist +When invoking the GET method to obtain information of Edge Cloud Zones with a region and a status (active,inactive,unknown) +Then response code is 404 diff --git a/code/Test_definitions/Simple_Edge_discovery_Test.feature b/code/Test_definitions/Simple_Edge_discovery_Test.feature new file mode 100644 index 00000000..19c3fcb8 --- /dev/null +++ b/code/Test_definitions/Simple_Edge_discovery_Test.feature @@ -0,0 +1,55 @@ +#/*- ---license-start +#* CAMARA Project +#* --- +#* Copyright (C) 2022 - 2023 Contributors | Deutsche Telekom AG to CAMARA a Series of LF Projects, LLC +#* The contributor of this file confirms his sign-off for the +#* Developer Certificate of Origin (http://developercertificate.org). +#* --- +#* 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. +#* ---license-end +#*/ + +@EDS +Feature: EDS API test + + @EDSGetClosestMECPlatform + Scenario: API Client requests name of closest MEC platform to a target UE + Given Use the EDS MOCK URL + When API Client makes a valid GET request + Then Response code is 200 + And The response includes the name of the closest MEC platform + And The response includes the name of the MEC platform provider + + @EDSNoFilterParameter + Scenario: API Client omits filter parameter + Given Use the EDS MOCK URL + When The filter parameter is omitted + Then Response code is 400 + + @EDSIncorrectFilterParameterValue + Scenario: API Client provides incorrect filter value + Given Use the EDS MOCK URL + When The filter parameter value is not 'closest' + Then Response code is 400 + + @EDSInvalidUEIdentity + Scenario: the user device cannot be identified from the provided parameters + Given Use the EDS MOCK URL + When API is requested with invalid user device identity + Then Response code is 404 + + @EDSInternalServerError + Scenario: Operator unable to resolve closest MEC platform + Given Use the EDS MOCK URL + When The operator is unable to resolve the closest MEC platform + Then Response code is 500 diff --git a/code/Test_definitions/Traffic_Influence_Test.feature b/code/Test_definitions/Traffic_Influence_Test.feature new file mode 100644 index 00000000..5f292c71 --- /dev/null +++ b/code/Test_definitions/Traffic_Influence_Test.feature @@ -0,0 +1,86 @@ +#/*- ---license-start +#* CAMARA Project +#* --- +#* Copyright (C) 2022 - 2023 Contributors | Deutsche Telekom AG to CAMARA a Series of LF Projects, LLC +#* The contributor of this file confirms his sign-off for the +#* Developer Certificate of Origin (http://developercertificate.org). +#* --- +#* 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. +#* ---license-end +#*/ + +@TI @TISanity +Feature: Automated Traffic Influence API Test + + @TI_Resource_LCM_Mandatory_Parameters_Valid + Scenario: Manage Traffic Influence (TI) Resource with mandatory parameters + When creating a new TI Resource, with POST, with mandatory parameters ("apiConsumerId", "applicationId") + Then it should be created a new TI Resource and the optimal routing will be activated for any user on any location + And Response Code is 201 + And response contains the TI Resource with the resource identifier ("trafficInfluenceID") valorised with a unique value, the status of the request ("state=ordered") and the previously used parameters valorised as in the POST request + When asking for a previously created TI Resource, with GET, with the parameter "trafficInfluenceID" valorised with the reponse of the previous POST + Then Response code is 200 + And response contains a TI Resource with a potentially updated status ("state") reporting the current status of the traffic influece configuration (ordered, created, active, error, deleted) + When deleting an existing TI Resource, with DELETE, with the parameter "trafficInfluenceID" valorised with the reponse of the previous POST + Then Response Code is 202 and the response message is Accepted meaning that the resource deletion is accepted and in progress. The satus update can be retrived with the GET method on that TI Resource. The final value of the parameter "state" is "deleted". + + @TI_Resource_LCM_Optional_Parameters_Valid + Scenario: Manage Traffic Influence (TI) Resource with also optional parameters + Given the usage of the Traffic Influece API URL + When creating a new TI Resource, with POST, with mandatory parameters ("apiConsumerId", "applicationId") and any other optional parameters (e.g. "instanceId, "zone" etc.) + Then it should be created a new TI Resource and the optimal routing will be activated according to the optional paramters specified (e.g. only in a specific zone or for a specific user) + And Response Code is 201 + And response contains the TI Resource with the resource identifier ("trafficInfluenceID"), the status of the request ("state=ordered") and the previously used parameters valorised as in the POST request + When asking for a previously created TI Resource, with GET, with the parameter "trafficInfluenceID" valorised with the reponse of the previous POST + Then Response code is 200 + And response contains a TI Resource with the a potentially updated status ("state") reporting the current status of the traffic influece configuration (ordered, created, active, error, deleted) + When updating an existing TI Resource, with, PATCH, with the parameter "trafficInfluenceID" valorised with the reponse of the previous POST and with some of the optional parameters updated (the madatory parameters can not be updated) and, potentially, some of the optional parameters still having the same value as before + Then the TI Resource is modified + And Response Code is 200 + And response contains the TI Resource with the resource identifier ("trafficInfluenceID"), the status of the request ("state=ordered") and the previously used paramters valorised as in the PATCH request + When deleting an existing TI Resource, with DELETE, with the parameter "trafficInfluenceID" valorised with the reponse of the previous POST + Then Response Code is 202 and the responce message is Accepted meaning that the resource deletion is accepted and in progress. The satus update can be retrived with the GET method on that TI Resource. The final value of the parameter "state" is "deleted". + + @TI_Resource_LCM_Invalid_Parameters + Scenario: Manage Traffic Influence Resource with invalid paramters + Given the usage of the Traffic Influence API URL + When creating a new TI Resource, with POST, with invalid parameters (mandatory or optionals) + Then no new TI Resource is created and no optimal routing will be activated + And Response Code is 400 + When asking for a previously created TI Resource, with GET, with an invalid parameter "trafficInfluenceID" + Then Response code is 404 + When updating an existing TI Resource, with, PATCH, with invalid an invalid parameter "trafficInfluenceID" + Then Response Code is 404 + When updating an existing TI Resource, with, PATCH, with invalid parameters (with the exclusion of "trafficInfluenceID") + Then Response Code is 400 + When deleting an existing TI Resource, with DELETE, with an invalid parameter "trafficInfluenceID" + Then Response Code is 400 + + @TI_Incomplete_Parameters_TI_Creation + Scenario: Creation of new TI Resource without all the mandatory parameters + Given the usage of the Traffic Influece API URL + When creating a new TI Resource, with POST, without all the mandatory parameters ("apiConsumerId", "applicationId") + Then no new TI Resource is created and no optimal routing will be activated + And Response Code is 400 + + @TI_Resource_LCM_Modify_Resource_User_Mobility + Scenario: Modify an already created Traffic Influence (TI) Resource when a Device moves to another geographical area + Given the usage of the Traffic Influece API URL + When modifiyng a existing TI Resource, with PATCH, with mandatory parameters ("apiConsumerId", "applicationId"), with the identifier for the existing resource ("trafficInfluenceID") and other optional, editable, parameters (e.g. "instanceId, "zone" etc.) to identify a new Edge Application instance closer to the Device that has moved in a new geographical area. + Then it should be modified the TI Resource and the new optimal routing will be activated according to the optional paramters specified (e.g. in a new zone) + And Response Code is 201 + And response contains the original TI Resource with the resource identifier ("trafficInfluenceID") unmodified, the status of the request ("state=ordered"), the new parameters valorised as in the PATCH request and the other original paramenters unmodified. + + + + diff --git a/documentation/.DS_Store b/documentation/.DS_Store new file mode 100644 index 00000000..f8e02251 Binary files /dev/null and b/documentation/.DS_Store differ diff --git a/documentation/API_Documentation/Simple_Edge_Discovery.md b/documentation/API_Documentation/Simple_Edge_Discovery.md deleted file mode 100644 index 307767ad..00000000 --- a/documentation/API_Documentation/Simple_Edge_Discovery.md +++ /dev/null @@ -1,86 +0,0 @@ -# Overview -The Simple Edge Discovery API returns the name of the MEC platform ('operator edge site') closest to device from where the query was made. It requires the device to be connected to edge operator's network. - -# Introduction -This API provides a simple way to know which MEC platform is closest to the customer's device. Typically this MEC platform will support the best network performance between client and server, since propgation delay is minimised. Knowing which is the closest MEC platform allows: -1. an application client to proceed to connect to any application server hosted on that MEC platform, for which the IP address was provided when the instance was spun up using the cloud provider tools, -2. an application developer to spin up an instance of their application server on that MEC platform, using their cloud provider tools. - -Note that the Simple Edge Discovery API offers an advantage over geolocation. Instead it calculates the shortest network path between the device and the MEC platform, which is more accurate and takes into account internal operator network topology (which can vary greatly between networks). - -# Quick Start -1. Make a GET request to the API's /mecplatforms/ resource. -2. Query the JSON response with `$.MECPlatforms[0].ern` to return the cloud provider's name for the closest MEC platform -3. You can also check the status of the MEC platform using `$.MECPlatforms[0].status` - -_note, MECPlatforms is an array because the Simple Edge Discovery API is a subset of a more complex CAMARA API, 'MEC Exposure and Experiencve Management'. That API can return an array of MEC Platforms ranked according to proximity, compute resources, and load status. But the Simple Edge API will just return the closest. - -# Authentication and/or Authorization -Please follow the registration process of the operator implementing the API to acquire an authentication key, and bearer token. -'Closest MEC platform' is network information and not considered personally identifiable information (PII) - it is not expected that this API will require user consent. - - -# Endpoint definitions -- Endpoint: `/mecplatforms/` -- Method accepted: GET -- Parameters: none* -- HTTP codes: `200 OK` -- HTTP Response body: application/json - -## Constraints -The endpoint must be called by an HTTP client hosted by a device that is attached to the operator's network. If the operator only provides a cellular (mobile) edge platform, then the device must be attached to the operator's mobile network with a valid SIM. - -# Errors -`HTTP 401 Unauthorized` - ensure you have a valid API key and/or bearer token (see operator documentation) -`HTTP 404 Not Found` - check the URI for any syntax error - -# Code snippets - -`HTTP GET /MECPlatforms` - -`HTTP 200 OK application/json` - -```javascript -{ - "MECPlatforms": [ - { - "ern": "example London MEC name from cloud provider", - "zone": "geographic location of MEC Platform, e.g. London", - "region": "geographic region of MEC Platform, UK South", - "status": "active | inactive | unknown", - "properties": [ - { - "type": "string" - } - ] - } - ], - "links": [ - { - "link": { - "rel": "ListMECPlatforms", - "method": "get", - "href": "/mecplatforms" - } - } - ] -} - -``` - -Response processing: -`$.MECPlatforms[0].ern` -> "example London MEC name from cloud provider" -`$.MECPlatforms[0].status` -> one of `active`, `inactive`, `unknown` - -# FAQs -_Can I use the device GPS to locate the closest MEC?_ -_Can I ping the various MEC platforms and calculate the closest from that?_ -The answer to both of these is 'not reliably': -- Each device has an IP 'anchor point' in the operator mobile network which may be a significant distance from the location of the device itself. It is this path - IP anchor to MEC PLatform - that decides the shortest network path and hence shortest propagation delay. -- ping (both ICMP and TCP) fistly requires having deployed endpoints to ping - which may not be the case if the application server has not been deployed on more than on MEC platform. Secondly, mobile networks are volatile, and ping results will not give an accurate picture of the static network topology. - -# Release Notes -v1.1.2 minor bug fixes with error types - -# API Spec -YAML available at: https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/simple_edge_discovery.yaml diff --git a/documentation/API_Documentation/Traffic_Influence_API_Documentation.md b/documentation/API_Documentation/Traffic_Influence_API_Documentation.md deleted file mode 100644 index af9027c9..00000000 --- a/documentation/API_Documentation/Traffic_Influence_API_Documentation.md +++ /dev/null @@ -1,316 +0,0 @@ - -# OPAG-CAMARA Traffic Influence API -## Overview - -The reference scenario foresees a Service owned by a Developer, composed by one or more Service Producers provided by the Developer and deployed in different geographical locations on Telco Operator Edge sites (MEC sites) or in Cloud. The Service Producer, deployed at the Edge, is referred as Edge Application Server (EAS). -The Traffic Influence API provides the fastest routing from the user equipment (e.g. a Smartphone) to the optimal Edge Application Server (EAS) Instance in a specific geographical location, installed in a Telco Operator Edge site. -If a Service is offered by a Cloud Instance and by Edge Instances, the API can be used to route a selected set of users on the Edge Instance. - -## 1. Introduction - -The Traffic Influence API provides the capability to establish the best connectivity, in terms of latency, in a specific geographical area, between the User Equipment (UE), e.g. the user’s smartphone, and the optimal Edge Application Server instance nearby. -The Service architecture foresees one or more EASs and a component, the Application Function (AF), that is the API consumer. Invoking the TI API, the AF can create a "TrafficInfluence" resource specifying the desired request. -The TI API provider implements the intent specified in the Traffic Influence resource. -While the API is usually invoked to activate the fastest routing for any user, it can also be used to request the routing for a specific user. Invoking the API for each user (using the same "trafficInfluenceID"), the "TrafficInfluence" resource provides the requested routing for a set of users. - -## 2. Quick Start -The usage of the Traffic Influence API is based on the management of a "TrafficInfluence" resource, an object containing the intent requested invoking the Traffic Influence API and that is implemented by the platform configuring the Mobile Network for the optimal routing toward the EAS Instance. -The "TrafficInfluence" resource can be created (providing the related parameters that specify the desired intent), queried, modified and deleted. -The API is asynchronous, a notification is available providing information about the status of the requested resource. -For an Application (identified by "applicationId") many "TrafficInfluence" resources can be created, e.g. to add multiple users, regions or zones. - -Before starting to use the API, the developer needs to know about the below specified details: - -**Base-Url** -The RESTful Traffic Influence API endpoint, for example [**https://tim-api.developer.tim.it/trafficinfluence**](https://tim-api.developer.tim.it/trafficinfluence) - -**Authentication** -Configure security access keys such as OAuth 2.0 client credentials to be used by Client applications which will invoke the Traffic InfluenceAPI. - -**TrafficInfluence** -This object represents the resource that carries the requirements from the user to be implemented. The Traffic Influence API is invoked for the life cycle management of this resource (CRUD). The resource contains the intents from the API Consumer. Managing this resource, the developer can specify in which geographical location the routing must be applied, toward which application, maybe for a specific set of users or for a limited period pf time. - -**trafficInfluenceID** -Identifier for the Traffic Influence resource. This parameter ir returned by the API and must be used to update it (e.g., adding new users or deleting it) - -**applicationFunctionId** -Unique identifier for the Application Function (AF), the TI API consumer. - -**region** -The developer can specify in which geographical area he requires the fastest routing toward the nearest application instance. A Region is a wide geographical area and it contains one ore more Zones. A Zone is where the Edge Datacenters are located. Zones and Regions identifiers are defined and provided by the Telco Operator and can also be used or retrieved with other CAMARA APIs ("MEC Exposure & Experience Management API" and "Simple Edge Discovery"). To add more regions the API must be invoked (PUT) of each region. New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Application (identified by "applicationId"). - -**zone** -The developer can specify in which geographical area he requires the fastest routing toward the nearest application instance. A Zone is a smaller geographical area inside a Region. A Zone is where the Edge Datacenters are located. To add more zones the API must be invoked (PUT) of each zone. New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Application (identified by "applicationId"). - -**applicationId** -Unique Application identifier inside the Telco Operator Platform. - -**trafficFilters** -The Application can expose different service on different interfaces, with this parameter it is possible to enable just some of those services maybe for different sets of users. - -**usersId** -Optionally a user can be provided as an input. To add more users the API must be invoked (PUT) of each user. New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Applicatoin (identified by "applicatoinId"). The routing toward the selected Application Instance is only applied for provided users. - -**Notification URL and token** -Developers have a chance to specify callback URL on which notifications (eg. session termination) regarding the session can be received from the service provider. This is also an optional parameter. - -## 3. Authentication and Authorization -The Traffic Influence API makes use of the client credentials grant which is applicable for server to server use cases involving trusted partners or clients without any protected user data involved. -In this method the API invoker client is registered as a confidential client with an authorization grant type of client\\_credentials [2]. - -## 4. API Documentation -## 4.1 Details - -The Traffic Influence (TI) API is consumed by an Application Function (AF) requesting for the fastest routing of the traffic flow from the User Equipments toward an instance of the Edge Application Server (EAS) in a Telco Operator Edge sites (MEC sites). - -When the EAS is onboarded and deployed in the MEC site, the Application is identified with a unique identifier (applicationId). - -Using the application identifier ("applicationId") and specifying a Zone or a Region, the Telco Operator Platform, autonomously identifies the best instance of the EAS toward routing the traffic flow and configures the Mobile Network accordingly to get the fastest routing. -If just the application identifier is used, the Telco Operator Platform identifies all the EAS Instances and activates the optimal routing on the Mobile Network. -If the fastest routing should be available just for a set of users, the API must be invoked for each user also passing the same TrafficInfluce resource identifier ("trafficInfluenceID") -If the Application offers different services on different interfaces a traffic filter based on IP, Port and Protocol can be used. I this way it is also possible to redirect different users to different interfaces. - -Here are some possible intents: - -1) activate the optimal routing for any EAS Instance: the API must be invoked with the applicationId. The Telco Operator Platform identifies all the EAS Instances and activates the optimal routing on the Mobile Network. -2) activate the optimal routing in a specific Region or Zone: the API must be invoked with the applicationId and the Zones and Regions identifiers. -3) activate the optimal routing for a specific set of users: the API can also be invoked with a user identifier ("userId"). The same TrafficInfluce resource identifier ("trafficInfluenceID") must be used in each call. - -### 4.2 Endpoint Definitions -## Version: 0.8.1 - -**License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) - -[Product documentation at Camara](https://github.com/camaraproject/) -### /traffic-influences - -#### GET -##### Summary - -Retries existing TrafficInfluence Resources - -##### Description - -Reads all of the active TrafficInfluence resources owned by the AF authenticated via oAuth2 - -##### Parameters - -| Name | Located in | Description | Required | Schema | -| ---- | ---------- | ----------- | -------- | ---- | -| applicationId | query | Not required. Used to select traffic influence resources filtered by applicationId | No | string | - -##### Responses - -| Code | Description | -| ---- | ----------- | -| 200 | Returns the information about existing TrafficInfluence resources. | -| 401 | Unauthorized | -| 403 | Forbidden | -| 500 | An unknow error has occurred | -| 503 | Service unavailable | -| 504 | Connection timeout towards backend service has occurred | - -#### POST -##### Summary - -Creates a new TrafficInfluence resource - -##### Description - -Gets in input an object containing the intents from the AF and creates a TrafficInfluence resourse accordingly. The trafficInfluenceID parameter, that is part of the object, must not be valorized when creating a new resource. It is automatically generated by the system and returned the response - -##### Responses - -| Code | Description | -| ---- | ----------- | -| 201 | TrafficInfluence resource created, the related object is returned with the resource ID (TIResource_id) and status (state) valorised, | -| 401 | Unauthorized | -| 403 | Forbidden | -| 500 | An unknow error has occurred | -| 503 | Service unavailable | -| 504 | Connection timeout towards backend service has occurred | - -### /traffic-influences/{TIResource_id} - -#### GET -##### Summary - -read a specific TrafficInfluence resource identified by the TIResource_id value - -##### Parameters - -| Name | Located in | Description | Required | Schema | -| ---- | ---------- | ----------- | -------- | ---- | -| TIResource_id | path | Identifier of the specific TrafficInfluence resource to be retrieved, modified or deleted. It is the value used to fill trafficInfluenceID parameter | Yes | string | - -##### Responses - -| Code | Description | -| ---- | ----------- | -| 200 | OK. | -| 401 | Unauthorized | -| 403 | Forbidden | -| 404 | The specified resource was not found | -| 500 | An unknow error has occurred | -| 503 | Service unavailable | -| 504 | Connection timeout towards backend service has occurred | - -#### PUT -##### Summary - -updates a specific TrafficInfluence resource, identified by the TIResource_id value - -##### Description - -The resource identified by the TIResource_id value can be modified - -##### Parameters - -| Name | Located in | Description | Required | Schema | -| ---- | ---------- | ----------- | -------- | ---- | -| TIResource_id | path | Identifier of the specific TrafficInfluence resource to be retrieved, modified or deleted. It is the value used to fill trafficInfluenceID parameter | Yes | string | - -##### Responses - -| Code | Description | -| ---- | ----------- | -| 200 | TrafficInfluence resource edited, the related object is returned, the status (state) is updated. | -| 401 | Unauthorized | -| 403 | Forbidden | -| 404 | The specified resource was not found | -| 500 | An unknow error has occurred | -| 503 | Service unavailable | -| 504 | Connection timeout towards backend service has occurred | - -#### DELETE -##### Summary - -Delete an existing TrafficInfluence resource - -##### Parameters - -| Name | Located in | Description | Required | Schema | -| ---- | ---------- | ----------- | -------- | ---- | -| TIResource_id | path | Identifier of the specific TrafficInfluence resource to be retrieved, modified or deleted. It is the value used to fill trafficInfluenceID parameter | Yes | string | -| callbackUrl | query | the location where updated data will be sent. Must be network accessible by the source server | No | string (uri) | - -##### Responses - -| Code | Description | -| ---- | ----------- | -| 200 | The resource has been successfully deleted | -| 401 | Unauthorized | -| 403 | Forbidden | -| 404 | The specified resource was not found | -| 503 | Service unavailable | -| 504 | Connection timeout towards backend service has occurred | - -### Models - -#### TrafficInfluenceNotification - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| trafficInfluenceChanged | object | | Yes | - -#### TrafficInfluence - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| trafficInfluenceID | string | Identifier for the Traffic Influence resource. This parameter ir returned by the API and must be used to update it (e.g., adding new users or deleting it) passing it as TIResource_id value in the API call. | No | -| applicationFunctionId | string | Unique Identifier of the Application Function, the TI API consumer. | Yes | -| applicationId | string | Unique ID representing the Edge Application
_Example:_ `"Virtual_Reality_Arena"` | Yes | -| region | string | Unique identifier representing a region | No | -| zone | string | Unique identifier representing a zone | No | -| userId | object | User equipment identifier, it is composed by a value and a type for that value | No | -| state | string | _Enum:_ `"ordered"`, `"created"`, `"active"`, `"not active"`, `"error"`, `"deleted"` | No | -| trafficFilters | [ object ] | Identifies IP packet filters. To be used when a the Application needs a traffic flow towards a specific EAS interface | No | -| notificationUri | string | Defines the callback uri which should be notified in asynchronous way when the state for the requested resources changes (i.e. ordered to activated) | No | -| notificationAuthToken | string | Authentification token for callback API | No | - -#### types_zone_Id - -Unique identifier representing a zone - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| types_zone_Id | string | Unique identifier representing a zone | | - -#### types_region_Id - -Unique identifier representing a region - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| types_region_Id | string | Unique identifier representing a region | | - -#### userId - -User equipment identifier, it is composed by a value and a type for that value - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| UEIdentityType | string | Type of User Equipment identifier used in `UEIdentity`.
_Enum:_ `"IPAddress"`, `"MSISDN"`, `"IMEI"`, `"MDN"`, `"GPSI"` | No | -| UEIdentity | string | Identifier value for User Equipment. The type of identifier is defined by the 'UEIdentityType' parameter. | No | - -#### types_UEIdentityType - -Type of User Equipment identifier used in `UEIdentity`. - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| types_UEIdentityType | string | Type of User Equipment identifier used in `UEIdentity`. | | - -#### types_UEIdentity - -Identifier value for User Equipment. The type of identifier is defined by the 'UEIdentityType' parameter. - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| types_UEIdentity | string | Identifier value for User Equipment. The type of identifier is defined by the 'UEIdentityType' parameter. | | - -#### FlowInfo - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| flowId | integer | Indicates the IP flow. | Yes | -| flowDescriptions | [ string ] | Indicates the packet filters of the IP flow. The source IP is according to the TI API request, any IP (if no userId is provided) or the IP related to userId so it doesn't need to be specified int flowDescription. The protocol is identified by a number as defined by IANA (), e.g. 1 (UDP) or 2 (TCP). The destination IP and port must be specified.
_Example:_ `"protocol 1 to 10.98.0.0/24 5060"` | No | - -### 4.3 Errors -#### ErrResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| status | string | _Example:_ `"OK"` | No | -| message | string | _Example:_ `"OK"` | No | - -#### ErrorInfo - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| code | string | Code given to this error | Yes | -| message | string | Detailed error description | Yes | - -### 4.4 Policies - -N/A - -### 4.5 Code Snippets - -N/A -### 4.6 FAQ's - -(FAQs will be added in a later version of the documentation) - -### 4.7 Terms - -N/A - -### 4.8 Release Notes - -The Traffic Influence API reduces the complexity of the 3GPP Traffic Influence API exposed by the 3GPP Network Exposure Function (NEF) [1]. While the 3GPP TI API offers fastest routing activation and user mobility among different edge sites, this version of the CAMARA Traffic Influence API covers only the fastest routing activation, also for selected users. User mobility will be introduced in a future version. These release also has no effect on existing PDU sessions. - -## References - -[1] 3GPP TS 23.501: System architecture for the 5G System (5GS); Stage 2 (Release 17), V17.4.0 (2022-03) -[2] CAMARA Commonalities : Authentication and Authorization Concept for Service APIs https://github.com/camaraproject/WorkingGroups/blob/main/Commonalities/documentation/Working/CAMARA-AuthN-AuthZ-Concept.md \ No newline at end of file diff --git a/documentation/API_documentation/Simple_Edge_Discovery_API_Readiness_Checklist.md b/documentation/API_documentation/Simple_Edge_Discovery_API_Readiness_Checklist.md new file mode 100644 index 00000000..d875547c --- /dev/null +++ b/documentation/API_documentation/Simple_Edge_Discovery_API_Readiness_Checklist.md @@ -0,0 +1,13 @@ +# Simple Edge Discovery (EDS) API Readiness minimum criteria checklist + +
+ +| No | Deliverables/Criteria | Mandatory | Status (Contributed/Approved/Pending/Validated/Partly-Validated)| +|----|----------------------------------|-----------|---------------------------- +| 1 |API Spec | Y | Contributed | +| 2 |API Implementation | Y | Contributed | +| 3 |API Documentation | Y | Contributed | +| 4 |User Stories | Y | Contributed | +| 5 |API test cases | Y | Contributed Gherkin feature | +| 6 |Validated by atleast 2 operators | Y | Partly validated (tested in two distinct VodaFone markets | +| 7 |Security review | Y | Pending (no consent required) diff --git a/documentation/Contributions/.unotes/unotes_meta.json b/documentation/Contributions/.unotes/unotes_meta.json deleted file mode 100644 index 4ed84e41..00000000 --- a/documentation/Contributions/.unotes/unotes_meta.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "", - "isOrdered": true, - "folders": { - "Images": { - "name": "Images", - "isOrdered": true, - "folders": {}, - "files": {} - } - }, - "files": { - "README": 0, - "Proposal - Edge Cloud Rapository organization": 1 - } -} \ No newline at end of file diff --git a/documentation/Contributions/README.md b/documentation/Contributions/README.md deleted file mode 100644 index d4517609..00000000 --- a/documentation/Contributions/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# EdgeCloud – API\_Documentation -
-In this folder  will be all the documents about the Edge Cloud API Family \ No newline at end of file diff --git a/documentation/Contributions/edge_terminology.md b/documentation/Contributions/edge_terminology.md deleted file mode 100644 index d8029be3..00000000 --- a/documentation/Contributions/edge_terminology.md +++ /dev/null @@ -1,32 +0,0 @@ -| Term | Definition | -|------|------------| -|API Consumer | A user or an application consuming the MEC Exposure and Experience Management APIs. | -|Application Service Provider | the developer/publisher who deploys applications on MEC platforms. | -|Density | Minimum 4G/5G subscriber density in a geographical area, represented as the number of subscribers per square kilometer.| -|Edge Application | A cloud application that has some services deployed to MEC Platforms to take advantage of low latency and high bandwidth when interacting with devices.| -|Edge Resource | An object defined by the sevice provider representing an edge resource within its network domain, such as a MEC Platform.| -|MEC Platform | A collection of cloud computing resources housed in a TSP's network facility that provide Multiaccess Edge Computing (MEC) capabilities. | -|Optimal MEC Platforms | A list of one or more optimal MEC Platforms to register a Service Endpoint, based on the latency and availability of each MEC platform, and optionally also based on various query criteria (Service Profile, Region, subscriber density or UE identity) defined by the API Consumer. | -|Optimal MEC Service Endpoints | A list of one or more MEC Service Endpoints that provide optimal user experience to the client device, based on internal network conditions known to the MEC Platform, and also optionally based on various query criteria (Service Profile, Region, subscriber density or UE identity) defined by the API Consumer. | -|Region | A TSP defined string identifier representing a certain geographical or logical area where MEC resources and services are provided.| -|Registered MEC Hosted Services | Applications running on MEC platforms which are registered with Edge Discovery Service using the service registry APIs.| -|Service Endpoint | The routable endpoint of the service(s) within a deployed application that clients connect to, where a service is a subcomponent of application| -|Service Profile | Information about the MEC application and the associated service characteristics.| -|TSP | Telecommunications Service Provider. | -|UEIdentity | User Equipment identity, which can be a device's IP address, MSISDN, IMEI, MDN, or GPSI.| -|Zone | A logical collection of MEC Platforms in a telecommunication provider's network. A Zone is part of a Region.| -|Application Backend Part | An architectural part of an Application that is to be deployed on public or private (and central) cloud infrastructure.| -|Application Client | A specifically developed client component of an application. | -|Application Edge Part | An architectural part of an Edge Application that is to be deployed on edge compute cloudlets. An End-to-End Application may include multiple Application Edge Parts (e.g. microservices).| -|Application Instance | An instantiation of and Application Edge Part on a Cloudlet. | -|Application Provider | The provider of the application that accesses the OP to deploy its application on the Edge Cloud, thereby using the Edge Cloud Resources and Network Resources. An Application Provider may be part of a larger organisation, like an enterprise, enterprise customer of the OP, or be an independent entity.| -|Cloudlet| A point of presence for the Edge Cloud. It is the point where Edge Applications are deployed. A Cloudlet offers a set of resources at a particular location (either geographically or within a network) that would provide a similar set of network performance.| -|Edge Application | An Application whose architecture includes one or more Application Edge Parts (e.g. microservices).| -|Flavour | A set of characteristics for compute instances that define the sizing of the virtualised resources (compute, memory, and storage) required to run an application. Flavours can vary between operator networks.| -|Northbound Interface | NBI, The interface that exposes the Operator Platform to Application Providers.| -|Operator Platform | An Operator Platform (OP) facilitates access to the Edge Cloud capability of an Operator or federation of Operators and Partners.| -|Tenant | A Tenant is the commercial owner of the applications and the associated data.| -|Tenant Space | A Tenant Space is a subset of resources from a Cloudlet that are dedicated to a particular tenant. A Tenant Space has one or more Virtual Machines (VMs) running native or containerised applications or cover a complete server.| -|User Client | Functionality that manages on the user's side the interaction with the OP. The User Client (UC) represents an endpoint of the UNI and is a component on the User Equipment.| -|User Equipment (UE) | Any device with a SIM used directly by an end-user to communicate. UCs and Application Clients are deployed on the User Equipment. By default, the term “UE” means UE with the explicit SIM-based Telecom wireless network connectivity throughout the document.| -|User-Network Interface (UNI) | Enables the UC hosted in the user equipment to communicate with the OP. | diff --git a/documentation/Deliverables/README.md b/documentation/Deliverables/README.md deleted file mode 100644 index d4517609..00000000 --- a/documentation/Deliverables/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# EdgeCloud – API\_Documentation -
-In this folder  will be all the documents about the Edge Cloud API Family \ No newline at end of file diff --git a/documentation/MeetingMinutes/CAMARA Agenda 12th December.pptx b/documentation/MeetingMinutes/CAMARA Agenda 12th December.pptx new file mode 100644 index 00000000..0d530eec Binary files /dev/null and b/documentation/MeetingMinutes/CAMARA Agenda 12th December.pptx differ diff --git a/documentation/MeetingMinutes/CAMARA Agenda 19th December.pptx b/documentation/MeetingMinutes/CAMARA Agenda 19th December.pptx new file mode 100644 index 00000000..5c9bf8ca Binary files /dev/null and b/documentation/MeetingMinutes/CAMARA Agenda 19th December.pptx differ diff --git a/documentation/MeetingMinutes/CAMARA Agenda 23rd January.pptx b/documentation/MeetingMinutes/CAMARA Agenda 23rd January.pptx new file mode 100644 index 00000000..af19453c Binary files /dev/null and b/documentation/MeetingMinutes/CAMARA Agenda 23rd January.pptx differ diff --git a/documentation/MeetingMinutes/CAMARA Agenda 9th January.pptx b/documentation/MeetingMinutes/CAMARA Agenda 9th January.pptx new file mode 100644 index 00000000..1bcb96dc Binary files /dev/null and b/documentation/MeetingMinutes/CAMARA Agenda 9th January.pptx differ diff --git a/documentation/MeetingMinutes/EdgeCloud_MeetingMinuteslinksFromDecember2023.md b/documentation/MeetingMinutes/EdgeCloud_MeetingMinuteslinksFromDecember2023.md new file mode 100644 index 00000000..cd25eee0 --- /dev/null +++ b/documentation/MeetingMinutes/EdgeCloud_MeetingMinuteslinksFromDecember2023.md @@ -0,0 +1,24 @@ +# Edgecloud - Meetings Minutes + +Meeting minutes are kept from December 2023 in https://wiki.camaraproject.org/display/CAM/Edge+Cloud, please refer to that page to follow last updates. + +## December 2023 + +12/12/2024 + +https://wiki.camaraproject.org/display/CAM/2023-12-12%3A+SP-EDC+Minutes + +19/12/2024 + +https://wiki.camaraproject.org/display/CAM/2023-12-19%3A+SP-EDC+Minutes + +## January 2024 + +09/01/2024 + +https://wiki.camaraproject.org/display/CAM/2024-01-09%3A+SP-EDC+Minutes + +23/01/2024 + +https://wiki.camaraproject.org/display/CAM/2024-01-23%3A+SP-EDC+Minutes + diff --git a/documentation/Minutes/MOM - 2020816.md b/documentation/MeetingMinutes/MOM - 2020816.md similarity index 100% rename from documentation/Minutes/MOM - 2020816.md rename to documentation/MeetingMinutes/MOM - 2020816.md diff --git a/documentation/Minutes/MOM - 20220719.md b/documentation/MeetingMinutes/MOM - 20220719.md similarity index 100% rename from documentation/Minutes/MOM - 20220719.md rename to documentation/MeetingMinutes/MOM - 20220719.md diff --git a/documentation/Minutes/MOM - 20220802.md b/documentation/MeetingMinutes/MOM - 20220802.md similarity index 100% rename from documentation/Minutes/MOM - 20220802.md rename to documentation/MeetingMinutes/MOM - 20220802.md diff --git a/documentation/Minutes/MOM - 20220827.md b/documentation/MeetingMinutes/MOM - 20220827.md similarity index 100% rename from documentation/Minutes/MOM - 20220827.md rename to documentation/MeetingMinutes/MOM - 20220827.md diff --git a/documentation/Minutes/MOM_Convergence - 202209160.md b/documentation/MeetingMinutes/MOM_Convergence - 202209160.md similarity index 100% rename from documentation/Minutes/MOM_Convergence - 202209160.md rename to documentation/MeetingMinutes/MOM_Convergence - 202209160.md diff --git a/documentation/MeetingMinutes/README.MD b/documentation/MeetingMinutes/README.MD index 37aa0ff4..0c4ec9bd 100644 --- a/documentation/MeetingMinutes/README.MD +++ b/documentation/MeetingMinutes/README.MD @@ -1 +1,3 @@ -This README.MD can be deleted when the first file is added to this directory. +# Minutes archive + +This folder contains the minutes archive for meetings held before the use of the LF Wiki to store minutes. Please refer to [https://wiki.camaraproject.org/display/CAM/Edge+Cloud](https://wiki.camaraproject.org/display/CAM/Edge+Cloud) for current and recent minutes. diff --git a/documentation/Minutes/.unotes/templates/title_date.hbs b/documentation/Minutes/.unotes/templates/title_date.hbs deleted file mode 100644 index 750148be..00000000 --- a/documentation/Minutes/.unotes/templates/title_date.hbs +++ /dev/null @@ -1,4 +0,0 @@ -# {{capitalizeAll title}} - -{{formatDate date "llll"}} - diff --git a/documentation/Minutes/.unotes/unotes_meta.json b/documentation/Minutes/.unotes/unotes_meta.json deleted file mode 100644 index c22229db..00000000 --- a/documentation/Minutes/.unotes/unotes_meta.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "", - "isOrdered": true, - "folders": {}, - "files": { - "MOM - 20220719": 0, - "MOM - 20220802": 1, - "MOM - 2020816": 2 - } -} \ No newline at end of file diff --git a/documentation/SupportingDocuments/.DS_Store b/documentation/SupportingDocuments/.DS_Store new file mode 100644 index 00000000..27f95241 Binary files /dev/null and b/documentation/SupportingDocuments/.DS_Store differ diff --git a/documentation/SupportingDocuments/API proposals/.DS_Store b/documentation/SupportingDocuments/API proposals/.DS_Store new file mode 100644 index 00000000..7db5b198 Binary files /dev/null and b/documentation/SupportingDocuments/API proposals/.DS_Store differ diff --git a/documentation/SupportingDocuments/DeveloperJourney-Proposal.md b/documentation/SupportingDocuments/API proposals/DeveloperJourney-Proposal.md similarity index 100% rename from documentation/SupportingDocuments/DeveloperJourney-Proposal.md rename to documentation/SupportingDocuments/API proposals/DeveloperJourney-Proposal.md diff --git a/documentation/SupportingDocuments/API proposals/Discovery/.DS_Store b/documentation/SupportingDocuments/API proposals/Discovery/.DS_Store new file mode 100644 index 00000000..46cc0509 Binary files /dev/null and b/documentation/SupportingDocuments/API proposals/Discovery/.DS_Store differ diff --git a/code/API_definitions/MEC exposure and experience management.yaml b/documentation/SupportingDocuments/API proposals/Discovery/MEC exposure and experience management.yaml similarity index 80% rename from code/API_definitions/MEC exposure and experience management.yaml rename to documentation/SupportingDocuments/API proposals/Discovery/MEC exposure and experience management.yaml index fce71d52..8e9844be 100644 --- a/code/API_definitions/MEC exposure and experience management.yaml +++ b/documentation/SupportingDocuments/API proposals/Discovery/MEC exposure and experience management.yaml @@ -4,7 +4,7 @@ openapi: 3.0.0 ############################################################################ info: title: MEC Exposure & Experience Management API - version: 1.2.0 + version: 0.8.1 description: | # Introduction --- @@ -82,13 +82,6 @@ info: * __Update-service-profiles__ Update a Service Profiles * __Delete-service-profile__ Delete a Service Profile based on ID - __EVENTS AND SUBSCRIPTIONS__ - * __All-events__ list all events - * __All-subscriptions__ list all subscriptions - * __Create-subscription__ create a subscription for Edge Discovery and workload discovery events - * __Update-subscription__ Update a subscription for Edge Discovery and workload discovery events - * __Delete-subscription__ Delete a subscription for Edge Discovery and workload discovery events - __COMMON__ * __Self__ the self-referring URI for the response * __Version-History__ link to version history for this API @@ -185,9 +178,9 @@ paths: type: object properties: resources: - $ref: '#/components/schemas/resources' + $ref: '#/components/schemas/Resources' links: - $ref: '#/components/schemas/links_Common' + $ref: '#/components/schemas/LinksCommon' '401': $ref: '#/components/responses/Unauthorized' default: @@ -205,7 +198,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/resources_service_profile' + $ref: '#/components/schemas/ResourcesServiceProfile' description: service profile responses: '201': @@ -217,14 +210,14 @@ paths: type: object properties: serviceProfileId: - $ref: '#/components/schemas/types_service_profile_Id' + $ref: '#/components/schemas/TypesServiceProfileId' links: type: array items: oneOf: - - $ref: '#/components/schemas/links_Update-service-profile' - - $ref: '#/components/schemas/links_Delete-service-profile' - - $ref: '#/components/schemas/links_Common' + - $ref: '#/components/schemas/LinksUpdateServiceProfile' + - $ref: '#/components/schemas/LinksDeleteServiceProfile' + - $ref: '#/components/schemas/LinksCommon' '401': $ref: '#/components/responses/Unauthorized' default: @@ -247,13 +240,13 @@ paths: serviceProfiles: type: array items: - $ref: '#/components/schemas/resources_service_profile' + $ref: '#/components/schemas/ResourcesServiceProfile' links: type: array items: oneOf: - - $ref: '#/components/schemas/links_Create-service-profile' - - $ref: '#/components/schemas/links_Common' + - $ref: '#/components/schemas/LinksCreateServiceProfile' + - $ref: '#/components/schemas/LinksCommon' '401': $ref: '#/components/responses/Unauthorized' default: @@ -280,7 +273,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/resources_service_profile' + $ref: '#/components/schemas/ResourcesServiceProfile' '400': $ref: '#/components/responses/BadRequest' '401': @@ -300,7 +293,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/resources_service_profile' + $ref: '#/components/schemas/ResourcesServiceProfile' responses: '204': $ref: '#/components/responses/NoContent' @@ -352,13 +345,13 @@ paths: serviceEndpoints: type: array items: - $ref: '#/components/schemas/resources_edge_hosted_service' + $ref: '#/components/schemas/ResourcesEdgeHostedService' links: type: array items: oneOf: - - $ref: '#/components/schemas/links_Register-service-endpoint' - - $ref: '#/components/schemas/links_Common' + - $ref: '#/components/schemas/LinksRegisterServiceEndpoint' + - $ref: '#/components/schemas/LinksCommon' '401': $ref: '#/components/responses/Unauthorized' default: @@ -376,7 +369,7 @@ paths: schema: type: array items: - $ref: '#/components/schemas/resources_edge_hosted_service' + $ref: '#/components/schemas/ResourcesEdgeHostedService' responses: '201': # Action: discuss with team on diff with implementation and no 200 response @@ -388,15 +381,15 @@ paths: type: object properties: serviceEndpointsId: - $ref: '#/components/schemas/types_serviceEndpoints_Id' + $ref: '#/components/schemas/TypesServiceEndpointsId' links: type: array items: oneOf: - - $ref: '#/components/schemas/links_Update-service-endpoint' - - $ref: '#/components/schemas/links_Delete-service-endpoint' - - $ref: '#/components/schemas/links_Optimal-service-endpoints-by-service-profile' - - $ref: '#/components/schemas/links_Common' + - $ref: '#/components/schemas/LinksUpdateServiceEndpoint' + - $ref: '#/components/schemas/LinksDeleteServiceEndpoint' + - $ref: '#/components/schemas/LinksOptimalServiceEndpointsByServiceProfile' + - $ref: '#/components/schemas/LinksCommon' '401': $ref: '#/components/responses/Unauthorized' default: @@ -412,7 +405,7 @@ paths: in: path required: true schema: - $ref: '#/components/schemas/types_serviceEndpoints_Id' + $ref: '#/components/schemas/TypesServiceEndpointsId' get: operationId: get-service-endpoints-by-serviceEndpointsId responses: @@ -423,7 +416,7 @@ paths: schema: type: array items: - $ref: '#/components/schemas/resources_edge_hosted_service' + $ref: '#/components/schemas/ResourcesEdgeHostedService' '400': $ref: '#/components/responses/BadRequest' '401': @@ -445,7 +438,7 @@ paths: schema: type: array items: - $ref: '#/components/schemas/resources_edge_hosted_service' + $ref: '#/components/schemas/ResourcesEdgeHostedService' responses: '204': $ref: '#/components/responses/NoContent' @@ -477,87 +470,6 @@ paths: summary: Deregister an application's Service Endpoint description: Deregister an application's Service Endpoint from the MEC Platform(s). - ## Note: events and subscriptions are required, but shoud be contributed as a - ## separate CAMARA commonalities contribution to resuse across all APIs instead - # of being defined each time per API - #/events: - # get: - # operationId: get-events - # summary: 'List events, optionally filtered by query parameters' - # parameters: - # - in: query - # name: eventIds - # description: 'Event identifiers, delimited by pipe' - # required: false - # schema: - # type: array - # items: - # $ref: '#/components/schemas/types_event_Id' - # style: pipeDelimited - # explode: false - # - in: query - # name: limit - # required: false - # schema: - # type: integer - # minimum: 1 - # maximum: 50 - # default: 20 - # description: The numbers of items to return. - # - in: query - # name: resourceName - # required: false - # schema: - - - # $ref: '#/components/schemas/types_resource_name' - # description: resource name to filter data - - # responses: - # '200': - # description: List of events - # content: - # application/json: - # schema: - # title: GetEvents - # type: object - # properties: - # events: - # type: array - # items: - # $ref: '#/components/schemas/resources_event' - # tags: - # - Events and Subscriptions - - #'/events/{eventId}': - # parameters: - # - in: path - # name: eventId - # required: true - # schema: - # $ref: '#/components/schemas/types_event_Id' - # get: - # operationId: get-event-by-Id - # summary: Retrieve an event by event ID - # responses: - # '200': - # description: Returns the event object - # content: - # application/json: - # schema: - # $ref: '#/components/schemas/resources_event' - # '400': - # $ref: '#/components/responses/BadRequest' - # '401': - # $ref: '#/components/responses/Unauthorized' - # '404': - # $ref: '#/components/responses/NotFound' - # default: - # $ref: '#/components/responses/Unexpected' - # description: Retrieve single event by event id - # tags: - # - Events and Subscriptions - /mecplatforms: get: operationId: get-mecplatforms @@ -580,17 +492,17 @@ paths: MECPlatforms: type: array items: - $ref: '#/components/schemas/resources_mecplatform' + $ref: '#/components/schemas/ResourcesMecPlatform' links: type: array items: oneOf: - - $ref: '#/components/schemas/links_Optimal-MEC-platforms-by-region' - - $ref: '#/components/schemas/links_Optimal-MEC-platforms-by-density' - - $ref: '#/components/schemas/links_Optimal-MEC-platforms-by-service-profile' - - $ref: '#/components/schemas/links_Optimal-MEC-platforms-by-UE' - - $ref: '#/components/schemas/links_Register-service-endpoint' - - $ref: '#/components/schemas/links_Common' + - $ref: '#/components/schemas/LinksOptimalMECPlatformsByRegion' + - $ref: '#/components/schemas/LinksOptimalMECPlatformsByDensity' + - $ref: '#/components/schemas/LinksOptimalMECPlatformsByServiceProfile' + - $ref: '#/components/schemas/LinksOptimalMECPlatformsByUE' + - $ref: '#/components/schemas/LinksRegisterServiceEndpoint' + - $ref: '#/components/schemas/LinksCommon' '401': $ref: '#/components/responses/Unauthorized' default: @@ -615,14 +527,14 @@ paths: regions: type: array items: - $ref: '#/components/schemas/resources_region_metadata' + $ref: '#/components/schemas/ResourcesRegionMetadata' links: type: array items: oneOf: - - $ref: '#/components/schemas/links_Optimal-MEC-platforms-by-region' - - $ref: '#/components/schemas/links_Optimal-service-endpoints-by-region' - - $ref: '#/components/schemas/links_Common' + - $ref: '#/components/schemas/LinksOptimalMECPlatformsByRegion' + - $ref: '#/components/schemas/LinksOptimalServiceEndpointsByRegion' + - $ref: '#/components/schemas/LinksCommon' '401': $ref: '#/components/responses/Unauthorized' default: @@ -638,7 +550,7 @@ paths: name: regionId required: true schema: - $ref: '#/components/schemas/types_region_Id' + $ref: '#/components/schemas/TypesRegionId' get: operationId: get-region responses: @@ -647,7 +559,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/resources_region' + $ref: '#/components/schemas/ResourcesRegion' '401': $ref: '#/components/responses/Unauthorized' '404': @@ -676,15 +588,15 @@ paths: zones: type: array items: - $ref: '#/components/schemas/resources_zone_metadata' + $ref: '#/components/schemas/ResourcesZoneMetadata' links: type: array items: oneOf: - - $ref: '#/components/schemas/links_Optimal-MEC-platforms-by-region' - - $ref: '#/components/schemas/links_Optimal-MEC-platforms-by-zone' - - $ref: '#/components/schemas/links_Optimal-service-endpoints-by-zone' - - $ref: '#/components/schemas/links_Common' + - $ref: '#/components/schemas/LinksOptimalMECPlatformsByRegion' + - $ref: '#/components/schemas/LinksOptimalMECPlatformsByZone' + - $ref: '#/components/schemas/LinksOptimalServiceEndpointsByZone' + - $ref: '#/components/schemas/LinksCommon' '401': $ref: '#/components/responses/Unauthorized' default: @@ -697,7 +609,7 @@ paths: '/zones/{zoneId}': parameters: - schema: - $ref: '#/components/schemas/types_zone_Id' + $ref: '#/components/schemas/TypesZoneId' name: zoneId in: path required: true @@ -710,7 +622,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/resources_zone' + $ref: '#/components/schemas/ResourcesZone' '400': $ref: '#/components/responses/BadRequest' '401': @@ -761,23 +673,21 @@ components: # RESOURCES ####################################################### schemas: - resources: + Resources: type: array items: oneOf: - - $ref: '#/components/schemas/links_All-regions' - - $ref: '#/components/schemas/links_All-zones' - - $ref: '#/components/schemas/links_All-mec-platforms' - - $ref: '#/components/schemas/links_All-service-profiles' - - $ref: '#/components/schemas/links_All-service-endpoints' - #- $ref: '#/components/schemas/links_All-subscriptions' - #- $ref: '#/components/schemas/links_All-events' + - $ref: '#/components/schemas/LinksAllRegions' + - $ref: '#/components/schemas/LinksAllZones' + - $ref: '#/components/schemas/LinksAllMecPlatforms' + - $ref: '#/components/schemas/LinksAllServiceProfiles' + - $ref: '#/components/schemas/LinksAllServiceEndpoints' additionalProperties: false - resources_service_profile: + ResourcesServiceProfile: type: object properties: serviceProfileId: - $ref: '#/components/schemas/types_service_profile_Id' + $ref: '#/components/schemas/TypesServiceProfileId' clientType: type: string enum: @@ -804,12 +714,12 @@ components: type: string description: network resource name or properties additionalProperties: - $ref: '#/components/schemas/types_networkResources' + $ref: '#/components/schemas/TypesNetworkResources' computeResources: type: string description: compute resource name or properties additionalProperties: - $ref: '#/components/schemas/types_computeResources' + $ref: '#/components/schemas/TypesComputeResources' properties: type: object properties: @@ -820,25 +730,21 @@ components: required: - clientType additionalProperties: false - resources_edge_services_registration: - type: array - items: - $ref: '#/components/schemas/resources_edge_service_description' - resources_edge_service_description: + ResourcesEdgeServiceDescription: type: object properties: edgeHostedService: - $ref: '#/components/schemas/resources_edge_hosted_service' - resources_edge_hosted_service: + $ref: '#/components/schemas/ResourcesEdgeHostedService' + ResourcesEdgeHostedService: description: Edge hosted service represented by Service Endpoint definition type: object properties: ern: - $ref: '#/components/schemas/types_edgeResource' + $ref: '#/components/schemas/TypesEdgeResource' serviceEndpointsId: - $ref: '#/components/schemas/types_serviceEndpoints_Id' + $ref: '#/components/schemas/TypesServiceEndpointsId' serviceEndpoint: - $ref: '#/components/schemas/resources_service_endpoint' + $ref: '#/components/schemas/ResourcesServiceEndpoint' applicationServerProviderId: type: string description: Unique ID representing the Edge Application Provider @@ -850,22 +756,22 @@ components: description: Description of the Service Endpoint additionalProperties: false serviceProfileID: - $ref: '#/components/schemas/types_service_profile_Id' - resources_service_endpoint: + $ref: '#/components/schemas/TypesServiceProfileId' + ResourcesServiceEndpoint: type: object properties: - URI: + uri: type: string description: URI of Service Endpoint if available format: uri - FQDN: + fqdn: type: string description: FQDN of Service Endpoint if available - IPv4Address: + ipv4Address: type: string description: IPv4 Address of Service Endpoint if available format: ipv4 - IPv6Address: + ipv6Address: type: string description: IPv6 Address of Service Endpoint if available format: ipv6 @@ -874,15 +780,15 @@ components: description: | Port information of Service Endpoint if IPv4 or IPv6 is mentioned additionalProperties: false - resources_mecplatform: + ResourcesMecPlatform: type: object properties: ern: - $ref: '#/components/schemas/types_edgeResource' + $ref: '#/components/schemas/TypesEdgeResource' zone: - $ref: '#/components/schemas/types_zone_Id' + $ref: '#/components/schemas/TypesZoneId' region: - $ref: '#/components/schemas/types_region_Id' + $ref: '#/components/schemas/TypesRegionId' status: description: Status of the MEC Platform (default is 'unknown') type: string @@ -901,9 +807,9 @@ components: data: type: object additionalProperties: false - resources_region: + ResourcesRegion: allOf: - - $ref: '#/components/schemas/resources_region_metadata' + - $ref: '#/components/schemas/ResourcesRegionMetadata' - type: object required: - zones @@ -911,13 +817,13 @@ components: zones: type: array items: - $ref: '#/components/schemas/resources_zone' + $ref: '#/components/schemas/ResourcesZone' additionalProperties: false - resources_region_metadata: + ResourcesRegionMetadata: type: object properties: regionId: - $ref: '#/components/schemas/types_region_Id' + $ref: '#/components/schemas/TypesRegionId' name: type: string countryCode: @@ -928,81 +834,53 @@ components: type: string additionalProperties: false - resources_zone: + ResourcesZone: allOf: - - $ref: '#/components/schemas/resources_zone_metadata' + - $ref: '#/components/schemas/ResourcesZoneMetadata' - type: object required: - MECPlatforms properties: - MECPlatforms: + mecPlatforms: type: array items: - $ref: '#/components/schemas/resources_mecplatform' + $ref: '#/components/schemas/ResourcesMecPlatform' additionalProperties: false - resources_zone_metadata: + ResourcesZoneMetadata: type: object properties: zoneId: - $ref: '#/components/schemas/types_zone_Id' + $ref: '#/components/schemas/TypesZoneId' regionId: - $ref: '#/components/schemas/types_region_Id' + $ref: '#/components/schemas/TypesRegionId' additionalProperties: false ###################################################### # IDs ####################################################### - types_edgeResource: + TypesEdgeResource: description: | An object defined by the service provider representing an edge resource within its network domain, such as a MEC Platform. The string contains colon-separated metadata in the form ern::::: type: string additionalProperties: false - types_resource_name: - description: | - A user friendly name to group events. - enum: - - ern - - networkIntelligence - - edgeApplicationServer - - ue - additionalProperties: false - types_region_Id: + TypesRegionId: description: | Unique identifier representing a region type: string additionalProperties: false - types_serviceEndpoints_Id: + TypesServiceEndpointsId: description: | A system-defined string identifier representing one or more registered Service Endpoints. type: string readOnly: true additionalProperties: false - types_service_profile_Id: + TypesServiceProfileId: description: | Unique identifier for a service profile type: string readOnly: false additionalProperties: false - types_user_Id: - description: User equipment identifier that uniquely identifies an API caller - type: object - properties: - - UEIdentityType: - type: string - enum: - - MSISDN - - IPAddress - - IMEI - - MDN - - GPSI - UEIdentity: - $ref: '#/components/schemas/types_UEIdentity' - required: - - UEIdentityType - - UEIdentity - additionalProperties: false - types_zone_Id: + TypesZoneId: description: | Unique identifier representing a zone type: string @@ -1011,11 +889,7 @@ components: ###################################################### # TYPES ####################################################### - types_networkRourceName: - description: name or tshirt size associated to the network resources required - type: string - additionalProperties: false - types_networkResources: + TypesNetworkResources: type: object properties: minBandwidthKbits: @@ -1034,7 +908,7 @@ components: type: integer description: Minimum availability required for the server additionalProperties: false - types_computeResources: + TypesComputeResources: type: object properties: GPU: @@ -1060,7 +934,7 @@ components: description: Minimum storgae requirement in Gigabytes description: Compute resources of a service profile additionalProperties: false - types_error: + TypesError: type: object properties: code: @@ -1068,13 +942,13 @@ components: message: type: string links: - $ref: '#/components/schemas/links_Common' + $ref: '#/components/schemas/LinksCommon' required: - code - message - links additionalProperties: false - types_success: + TypesSuccess: type: object properties: code: @@ -1082,13 +956,13 @@ components: message: type: string links: - $ref: '#/components/schemas/links_Common' + $ref: '#/components/schemas/LinksCommon' required: - code - message - links additionalProperties: false - types_UEIdentityType: + TypesUEIdentityType: description: Type of User Equipment identifier used in `UEIdentity`. type: string enum: @@ -1097,14 +971,14 @@ components: - IMEI - MDN - GPSI - types_UEIdentity: + TypesUEIdentity: description: Identifier value for User Equipment. The type of identifier is defined by the 'UEIdentityType' parameter. type: string ###################################################### # LINKS ####################################################### - links_All-mec-platforms: + LinksAllMecPlatforms: type: object readOnly: true properties: @@ -1129,7 +1003,7 @@ components: - method additionalProperties: false - links_All-service-profiles: + LinksAllServiceProfiles: type: object readOnly: true properties: @@ -1153,7 +1027,7 @@ components: - rel - method additionalProperties: false - links_All-service-endpoints: + LinksAllServiceEndpoints: type: object readOnly: true properties: @@ -1177,7 +1051,7 @@ components: - rel - method additionalProperties: false - links_All-regions: + LinksAllRegions: type: object readOnly: true properties: @@ -1201,7 +1075,7 @@ components: - rel - method additionalProperties: false - links_All-zones: + LinksAllZones: type: object readOnly: true properties: @@ -1225,7 +1099,7 @@ components: - rel - method additionalProperties: false - links_Optimal-MEC-platforms-by-region: + LinksOptimalMECPlatformsByRegion: type: object readOnly: true properties: @@ -1249,7 +1123,7 @@ components: - rel - method additionalProperties: false - links_Optimal-MEC-platforms-by-zone: + LinksOptimalMECPlatformsByZone: type: object readOnly: true properties: @@ -1273,7 +1147,7 @@ components: - rel - method additionalProperties: false - links_Optimal-MEC-platforms-by-density: + LinksOptimalMECPlatformsByDensity: type: object readOnly: true properties: @@ -1297,7 +1171,7 @@ components: - rel - method additionalProperties: false - links_Optimal-MEC-platforms-by-service-profile: + LinksOptimalMECPlatformsByServiceProfile: type: object readOnly: true properties: @@ -1321,7 +1195,7 @@ components: - rel - method additionalProperties: false - links_Optimal-MEC-platforms-by-UE: + LinksOptimalMECPlatformsByUE: type: object readOnly: true properties: @@ -1345,7 +1219,7 @@ components: - rel - method additionalProperties: false - links_Register-service-endpoint: + LinksRegisterServiceEndpoint: type: object readOnly: true properties: @@ -1369,7 +1243,7 @@ components: - rel - method additionalProperties: false - links_Update-service-endpoint: + LinksUpdateServiceEndpoint: type: object readOnly: true properties: @@ -1393,7 +1267,7 @@ components: - rel - method additionalProperties: false - links_Delete-service-endpoint: + LinksDeleteServiceEndpoint: type: object readOnly: true properties: @@ -1417,7 +1291,7 @@ components: - rel - method additionalProperties: false - links_Optimal-service-endpoints-by-service-profile: + LinksOptimalServiceEndpointsByServiceProfile: type: object readOnly: true properties: @@ -1441,7 +1315,7 @@ components: - rel - method additionalProperties: false - links_Optimal-service-endpoints-by-zone: + LinksOptimalServiceEndpointsByZone: type: object readOnly: true properties: @@ -1465,7 +1339,7 @@ components: - rel - method additionalProperties: false - links_Optimal-service-endpoints-by-region: + LinksOptimalServiceEndpointsByRegion: type: object readOnly: true properties: @@ -1489,7 +1363,7 @@ components: - rel - method additionalProperties: false - links_Create-service-profile: + LinksCreateServiceProfile: type: object readOnly: true properties: @@ -1513,7 +1387,7 @@ components: - rel - method additionalProperties: false - links_Update-service-profile: + LinksUpdateServiceProfile: type: object readOnly: true properties: @@ -1537,7 +1411,7 @@ components: - rel - method additionalProperties: false - links_Delete-service-profile: + LinksDeleteServiceProfile: type: object readOnly: true properties: @@ -1561,7 +1435,7 @@ components: - rel - method additionalProperties: false - links_Self: + LinksSelf: type: object readOnly: true properties: @@ -1584,7 +1458,7 @@ components: - rel - method additionalProperties: false - links_Version-History: + LinksVersionHistory: type: object readOnly: true properties: @@ -1607,7 +1481,7 @@ components: - rel - method additionalProperties: false - links_Terms-of-Service: + LinksTermsOfService: type: object readOnly: true properties: @@ -1630,7 +1504,7 @@ components: - rel - method additionalProperties: false - links_Bookmark: + LinksBookmark: type: object readOnly: true properties: @@ -1653,15 +1527,15 @@ components: - rel - method additionalProperties: false - links_Common: + LinksCommon: type: array readOnly: true items: oneOf: - - $ref: '#/components/schemas/links_Self' - - $ref: '#/components/schemas/links_Version-History' - - $ref: '#/components/schemas/links_Terms-of-Service' - - $ref: '#/components/schemas/links_Bookmark' + - $ref: '#/components/schemas/LinksSelf' + - $ref: '#/components/schemas/LinksVersionHistory' + - $ref: '#/components/schemas/LinksTermsOfService' + - $ref: '#/components/schemas/LinksBookmark' ###################################################### # PARAMETERS @@ -1689,7 +1563,7 @@ components: schema: type: array items: - $ref: '#/components/schemas/types_serviceEndpoints_Id' + $ref: '#/components/schemas/TypesServiceEndpointsId' style: pipeDelimited explode: false subscriberDensity: @@ -1700,19 +1574,19 @@ components: schema: type: integer UEIdentityType: - name: UEIdentityType + name: ueIdentityType description: Type of User Equipment identifier used in `UEIdentity`. in: query required: false schema: - $ref: '#/components/schemas/types_UEIdentityType' + $ref: '#/components/schemas/TypesUEIdentityType' UEIdentity: - name: UEIdentity + name: ueIdentity description: Identifier value for User Equipment. The type of identifier is defined by the UEIdentityType parameter. in: query required: false schema: - $ref: '#/components/schemas/types_UEIdentity' + $ref: '#/components/schemas/TypesUEIdentity' zone: name: zone description: MEC zone ID @@ -1725,18 +1599,6 @@ components: # RESPONSES ####################################################### responses: - OK: - description: HTTP 200 OK - content: - application/json: - schema: - $ref: '#/components/schemas/types_success' - Created: - description: HTTP 201 Created - content: - application/json: - schema: - $ref: '#/components/schemas/types_success' NoContent: description: HTTP 204 No Content BadRequest: @@ -1744,22 +1606,22 @@ components: content: application/json: schema: - $ref: '#/components/schemas/types_error' + $ref: '#/components/schemas/TypesError' NotFound: description: HTTP 404 The specified resource was not found content: application/json: schema: - $ref: '#/components/schemas/types_error' + $ref: '#/components/schemas/TypesError' Unauthorized: description: HTTP 401 Unauthorized content: application/json: schema: - $ref: '#/components/schemas/types_error' + $ref: '#/components/schemas/TypesError' Unexpected: description: HTTP 500 Internal Server Error content: application/json: schema: - $ref: '#/components/schemas/types_error' + $ref: '#/components/schemas/TypesError' diff --git a/documentation/SupportingDocuments/API proposals/Discovery/README.md b/documentation/SupportingDocuments/API proposals/Discovery/README.md new file mode 100644 index 00000000..d0341f04 --- /dev/null +++ b/documentation/SupportingDocuments/API proposals/Discovery/README.md @@ -0,0 +1,60 @@ +# Edge Discovery APIs + +## Simple Discovery API + +This API allows a client application to discover the closest MEC platform to the UE hosting the client application. 'Closest' means 'shortest network path' as that will give the shortest propagation distance, which is a major factor in latency. + +## MEC Experience Management and Exposure API + +This API allows a developer to: + +- discover available MEC platforms, ranked by proximity to a UE. +- read the state (availability and capabilities) of an operator's various MEC platforms. +- register a service profile (a description of the developer's edge service) with the MEC operator. +- register the deployed service endpoints with the MEC operator, which allows the closest service endpoint to be discovered at runtime. + +The API will also support the following capabilities: + +- events(such as change of status of a MEC platform or another event which could affect their service). +- subscription to notification of events. + +## Mapping to the list of intents + +These APIs fulfil the ['discovery' intents](https://github.com/camaraproject/EdgeCloud/blob/main/documentation/SupportingDocuments/Harmonisation%20of%20APIs/describing%20and%20harmonising%20the%20Edge%20APIs.md) + +*Simple Edge Discovery* fulfils a single intent, "4. I can discover the closest MEC platform to a specific terminal (closest in terms of shortest network path)" + +*MEC Exposure and Experience Management* is a more comprehensive discovery API and fulfils the following intents: + +### Developer intents + +#### Provisioning intents + +1. "I can retrieve a list of the operator’s MECs and their status, ordering the results by location and filtering by status (active/inactive/unknown)" +2. "I can discover the capabilities/resources available at an operator’s MEC: CPU, Memory, Storage, GPU" +3. "I can discover the geographical regions covered by the operators MECs" +4. "I can discover the closest MEC platform to a specific terminal (closest in terms of shortest network path)" + +16. "I can ask the operator to provide the details of all the on-boarded applications" +17. "I can ask the operator to inform about the application instance details e.g., communication endpoints, resource consumed etc" + +#### Runtime intents + +19. "I can discover the closest MEC platform to a particular terminal (closest in terms of shortest network path)" +20. "I can discover the optimal MEC platform for my application and a particular terminal, taking into account connectivity, shortest network path, cost, network load etc." (`A`) +21. "I can discover the optimal application service endpoint for a specific terminal, taking into account mobility events, connectivity, shortest network path, cost, network load, MEC platform load etc." + +### Operator intents + +#### Provisioning intents + +23. "I can publish an (ordered, filtered) list of my MECs, their coverage, capabilities and status" *(aligns with 1,2,3 in the developer intents)* +24. "I can map an application’s requirements to the best MEC for hosting it, based on application demands for CPU, Memory, Storage, GPU, bandwidth, Network forecast, mobility" *(aligns with 4,5,8,9)* + +#### Runtime intents + +25. "I can inform the developer of any event which changes which MEC is optimal for their application and connected terminals" *(aligns with 6)* + +## Notes + +`A` this may not be the closest MEC, rather the 'best MEC for this job' which accounts for current MEC or network load, MEC compute power and features etc. diff --git a/code/API_definitions/EdgeCloudApi_v0.0.5.yaml b/documentation/SupportingDocuments/API proposals/Resource Management/EdgeCloudApi_v0.0.5.yaml similarity index 100% rename from code/API_definitions/EdgeCloudApi_v0.0.5.yaml rename to documentation/SupportingDocuments/API proposals/Resource Management/EdgeCloudApi_v0.0.5.yaml diff --git a/documentation/SupportingDocuments/API proposals/Resource Management/README.MD b/documentation/SupportingDocuments/API proposals/Resource Management/README.MD new file mode 100644 index 00000000..4470fbe1 --- /dev/null +++ b/documentation/SupportingDocuments/API proposals/Resource Management/README.MD @@ -0,0 +1,5 @@ +# Resource Management + +# Description + +# Intents diff --git a/documentation/SupportingDocuments/API proposals/Traffic Influence/.DS_Store b/documentation/SupportingDocuments/API proposals/Traffic Influence/.DS_Store new file mode 100644 index 00000000..5008ddfc Binary files /dev/null and b/documentation/SupportingDocuments/API proposals/Traffic Influence/.DS_Store differ diff --git a/api_proposal/APIproposal_Traffic Influence_TIM.md b/documentation/SupportingDocuments/API proposals/Traffic Influence/APIproposal_Traffic Influence_TIM.md similarity index 100% rename from api_proposal/APIproposal_Traffic Influence_TIM.md rename to documentation/SupportingDocuments/API proposals/Traffic Influence/APIproposal_Traffic Influence_TIM.md diff --git a/documentation/SupportingDocuments/CAMARA Traffic Influence API.pdf b/documentation/SupportingDocuments/API proposals/Traffic Influence/CAMARA Traffic Influence API.pdf similarity index 100% rename from documentation/SupportingDocuments/CAMARA Traffic Influence API.pdf rename to documentation/SupportingDocuments/API proposals/Traffic Influence/CAMARA Traffic Influence API.pdf diff --git a/documentation/SupportingDocuments/API proposals/Traffic Influence/README.md b/documentation/SupportingDocuments/API proposals/Traffic Influence/README.md new file mode 100644 index 00000000..7b17ebae --- /dev/null +++ b/documentation/SupportingDocuments/API proposals/Traffic Influence/README.md @@ -0,0 +1,8 @@ +# Traffic Influence +The Traffic Influence API provides the ability to ask for the minimal end to end latency in a specific geographical area to enhance the quality of experience leveraging on local instances of an application deployed on the Edge Datacenters provided by a Telco Operator. +# Description +The Traffic Influence API hides the complexity of the network providing the developer with the possibility to express intents on having the minimal end to end latency toward geographically distributed instances of an Application. A possible scenario of usage of the API is the following: a Service is usually provided by a Cloud instances of an Application for every standard user. In some specific geographical areas, anyway, the Service can be provided by an edge instance of the Application for Premium users. The application management and control system invokes the Traffic Influence API to activate the appropriate routing at the Edge of the mobile network toward the local Application Instance for the Premium Users. Premium Users access the service in that geographical area with the best user experience while Standard users get a best effort service provided by the Cloud instances of the Service. +# Intents +The API can be invoked expressing the following intents: +- Provide the minimal end to end latency for all mobile users consuming the services provided by an application, onboarded on the Operator Platform, on every local instance that application is deployed +- The intent can also be expressed for a specific user or for a specific geographical area diff --git a/documentation/Presentation/Traffic Influence first release delivery.pdf b/documentation/SupportingDocuments/API proposals/Traffic Influence/Traffic Influence first release delivery.pdf similarity index 100% rename from documentation/Presentation/Traffic Influence first release delivery.pdf rename to documentation/SupportingDocuments/API proposals/Traffic Influence/Traffic Influence first release delivery.pdf diff --git a/documentation/SupportingDocuments/API proposals/Use Case MVP proposal/CAMARA EdgeCloud Use Case MVP Proposal.pptx b/documentation/SupportingDocuments/API proposals/Use Case MVP proposal/CAMARA EdgeCloud Use Case MVP Proposal.pptx new file mode 100644 index 00000000..8f2dc682 Binary files /dev/null and b/documentation/SupportingDocuments/API proposals/Use Case MVP proposal/CAMARA EdgeCloud Use Case MVP Proposal.pptx differ diff --git a/code/API_definitions/App.yaml b/documentation/SupportingDocuments/API proposals/Workload Orchestration/App.yaml similarity index 100% rename from code/API_definitions/App.yaml rename to documentation/SupportingDocuments/API proposals/Workload Orchestration/App.yaml diff --git a/documentation/SupportingDocuments/API proposals/Workload Orchestration/README.md b/documentation/SupportingDocuments/API proposals/Workload Orchestration/README.md new file mode 100644 index 00000000..262b3385 --- /dev/null +++ b/documentation/SupportingDocuments/API proposals/Workload Orchestration/README.md @@ -0,0 +1,5 @@ +# Workload Orchestration + +# Description + +# Intents diff --git a/code/API_definitions/app-client.yaml b/documentation/SupportingDocuments/API proposals/Workload Orchestration/app-client.yaml similarity index 100% rename from code/API_definitions/app-client.yaml rename to documentation/SupportingDocuments/API proposals/Workload Orchestration/app-client.yaml diff --git a/documentation/SupportingDocuments/API proposals/Workload Orchestration/edgexr-nb-openapi.yaml b/documentation/SupportingDocuments/API proposals/Workload Orchestration/edgexr-nb-openapi.yaml new file mode 100644 index 00000000..118b82ba --- /dev/null +++ b/documentation/SupportingDocuments/API proposals/Workload Orchestration/edgexr-nb-openapi.yaml @@ -0,0 +1,13433 @@ +# Auto-generated doc: DO NOT EDIT +openapi: 3.0.3 +info: + description: The Master Controller (MC) serves as the central API gateway for users + to orchestrate edge resources and provides several APIs to both application developers + and operators. Application developers can manage and monitor deployment of edge + applications. Operators can manage and monitor the usage of cloudlet infrastructures. + Both developers and operators can manage users within their Organization. + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + title: Edge Cloud Master Controller API Documentation + version: "2.0" +servers: +- description: localhost server + url: http://localhost:9900 +tags: +- description: Authentication is done by a user name or email plus a password. The + login function returns a JSON Web Token (JWT) once authenticated, that should + be included with subsequent API calls to authenticate the user. The JWT will expire + after a while for security, at which point you may need to log in again. + name: Security +- description: Users can be assigned roles for Organizations, allowing them to view + or manage resources associated with the Organizations. + name: User +- description: Roles can be assigned to users for Organizations, allowing the users + to view or manage resources associated with the Organizations. + name: Role +- description: Organizations group a set of resources together, for example Apps, + App Instances, or Cloudlets. Users given a role in an Organization can operate + on those resources in the scope provided by their role. + name: Organization +- description: OperatorCode maps a carrier code to an Operator organization name. + name: OperatorCode +- description: Flavors define the compute, memory and storage capacity of computing + instances. To put it simply, a flavor is an available hardware configuration for + a server. It defines the size of a virtual server that can be launched. + name: Flavor +- description: AutoProvPolicy defines the automated provisioning policy. + name: AutoProvPolicy +- description: AutoProvPolicy belonging to an app. + name: AppAutoProvPolicy +- description: AutoScalePolicy defines when and how ClusterInsts will have their nodes + scaled up or down. + name: AutoScalePolicy +- description: PrivacyPolicy defines security restrictions for cluster instances nodes + scaled up or down. + name: PrivacyPolicy +- description: AutoProvPolicyCloudlet belong to a cloudlet. + name: AutoProvPolicyCloudlet +- description: Pool of VMs to be part of a Cloudlet. + name: VMPool +- description: Members belong to a VMPool. + name: VMPoolMember +- description: Cloudlet is a set of compute resources at a particular location, provided + by an Operator. + name: Cloudlet +- description: CloudletPool defines a pool of Cloudlets that have restricted access. + name: CloudletPool +- description: Member belong to a cloudlet pool. + name: CloudletPoolMember +- description: ClusterInst is an instance of a Cluster on a Cloudlet. It is defined + by a Cluster, Cloudlet, and Developer key. + name: ClusterInst +- description: Provides information about the developer's application. + name: App +- description: AppInst is an instance of an App on a Cloudlet where it is defined + by an App plus a ClusterInst key. + name: AppInst +- description: Infra properties used to setup cloudlet. + name: CloudletProps +- description: Cloudlet resouce mapping. + name: CloudletResMap +- description: To match a flavor with platform flavor. + name: FlavorMatch +- description: Client is an AppInst client that called FindCloudlet DME Api. + name: AppInstClientKey +- description: ExecRequest is a common struct for enabling a connection to execute + some work on a container. + name: ExecRequest +- description: Collection of statistics related to Client/App/Cluster. + name: DeveloperMetrics +- description: Collection of statistics related to Cloudlet. + name: OperatorMetrics +- description: Collection of event/audit logs from edge services. + name: Events +- description: Usage details of App/Cluster. + name: DeveloperUsage +- description: Usage details of Cloudlet. + name: OperatorUsage +- description: Manage receiver for alerts from edge services. + name: AlertReceiver +- description: Manage additional networks which can be added to Cluster Instances. + name: Network +paths: + /api/v1/auth/alertreceiver/create: + post: + description: Create an alert receiver + operationId: CreateAlertReceiver + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAlertReceiver' + x-required-fields: + - name + - type + - severity + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateAlertReceiver + tags: + - AlertReceiver + /api/v1/auth/alertreceiver/delete: + post: + description: Delete an alert receiver + operationId: DeleteAlertReceiver + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAlertReceiver' + x-required-fields: + - name + - type + - severity + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteAlertReceiver + tags: + - AlertReceiver + /api/v1/auth/alertreceiver/show: + post: + description: Show alert receivers + operationId: ShowAlertReceiver + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAlertReceiver' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiAlertReceiver' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAlertReceiver + tags: + - AlertReceiver + /api/v1/auth/artifactory/resync: + post: + description: Resync MC and Artifactory data + operationId: ArtifactoryResync + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ArtifactoryResync + tags: + - Repos + /api/v1/auth/billingorg/addchild: + post: + description: Add an organization as a child of a billing organization + operationId: AddBillingOrgChild + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiBillingOrganization' + x-required-fields: + - name + - children + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddBillingOrgChild + tags: + - BillingOrg + /api/v1/auth/billingorg/create: + post: + description: Set up a BillingOrganization and validate inputs + operationId: CreateBillingOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiBillingOrganization' + x-required-fields: + - name + - type + - firstname + - lastname + - email + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateBillingOrg + tags: + - BillingOrg + /api/v1/auth/billingorg/delete: + post: + description: Delete a billing organization + operationId: DeleteBillingOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiBillingOrganization' + x-required-fields: + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteBillingOrg + tags: + - BillingOrg + /api/v1/auth/billingorg/deletepaymentprofile: + post: + description: Remove a payment profile + operationId: DeletePaymentProfile + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiPaymentProfileDeletion' + x-required-fields: + - org + - id + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeletePaymentProfile + tags: + - BillingOrg + /api/v1/auth/billingorg/invoice: + post: + description: "" + operationId: GetInvoice + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiInvoiceRequest' + x-required-fields: + - name + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/BillingInvoiceData' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetInvoice + tags: + - BillingOrg + /api/v1/auth/billingorg/removechild: + post: + description: Remove an organization from a billing organization + operationId: RemoveBillingOrgChild + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiBillingOrganization' + x-required-fields: + - name + - children + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveBillingOrgChild + tags: + - BillingOrg + /api/v1/auth/billingorg/show: + post: + description: Show billing organizations + operationId: ShowBillingOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiBillingOrganization' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiBillingOrganization' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowBillingOrg + tags: + - BillingOrg + /api/v1/auth/billingorg/showaccount: + post: + description: Show billing account information + operationId: ShowAccountInfo + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiAccountInfo' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAccountInfo + tags: + - BillingOrg + /api/v1/auth/billingorg/showpaymentprofiles: + post: + description: Show payment profiles associated with the billing org + operationId: ShowPaymentProfiles + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiBillingOrganization' + x-required-fields: + - name + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/BillingPaymentProfile' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowPaymentProfiles + tags: + - BillingOrg + /api/v1/auth/billingorg/update: + post: + description: Update a billing organization + operationId: UpdateBillingOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiBillingOrganization' + x-required-fields: + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateBillingOrg + tags: + - BillingOrg + /api/v1/auth/cloudletpoolaccessgranted/show: + post: + description: Show granted cloudletpool access + operationId: ShowCloudletPoolAccessGranted + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletPoolAccessGranted + tags: + - CloudletPoolAccess + /api/v1/auth/cloudletpoolaccessinvitation/create: + post: + description: Create a cloudletpool invitation + operationId: CreateCloudletPoolAccessInvitation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + x-required-fields: + - org + - region + - cloudletpool + - cloudletpoolorg + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateCloudletPoolAccessInvitation + tags: + - CloudletPoolInvitation + /api/v1/auth/cloudletpoolaccessinvitation/delete: + post: + description: Delete a cloudletpool invitation + operationId: DeleteCloudletPoolAccessInvitation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + x-required-fields: + - org + - region + - cloudletpool + - cloudletpoolorg + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteCloudletPoolAccessInvitation + tags: + - CloudletPoolInvitation + /api/v1/auth/cloudletpoolaccessinvitation/show: + post: + description: Show cloudletpool invitations + operationId: ShowCloudletPoolAccessInvitation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletPoolAccessInvitation + tags: + - CloudletPoolInvitation + /api/v1/auth/cloudletpoolaccesspending/show: + post: + description: Show pending cloudletpool invitations without responses + operationId: ShowCloudletPoolAccessPending + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletPoolAccessPending + tags: + - CloudletPoolAccess + /api/v1/auth/cloudletpoolaccessresponse/create: + post: + description: Create a cloudletpool response to an invitation + operationId: CreateCloudletPoolAccessResponse + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + x-required-fields: + - org + - region + - cloudletpool + - cloudletpoolorg + - decision + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateCloudletPoolAccessResponse + tags: + - CloudletPoolResponse + /api/v1/auth/cloudletpoolaccessresponse/delete: + post: + description: Delete a cloudletpool response to an invitation + operationId: DeleteCloudletPoolAccessResponse + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + x-required-fields: + - org + - region + - cloudletpool + - cloudletpoolorg + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteCloudletPoolAccessResponse + tags: + - CloudletPoolResponse + /api/v1/auth/cloudletpoolaccessresponse/show: + post: + description: Show cloudletpool responses + operationId: ShowCloudletPoolAccessResponse + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiOrgCloudletPool' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletPoolAccessResponse + tags: + - CloudletPoolResponse + /api/v1/auth/config/reset: + post: + description: Reset master controller global configuration + operationId: ResetConfig + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ResetConfig + tags: + - Config + /api/v1/auth/config/show: + post: + description: Show master controller global configuration + operationId: ShowConfig + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiConfig' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowConfig + tags: + - Config + /api/v1/auth/config/update: + post: + description: Update master controller global configuration + operationId: UpdateConfig + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiConfig' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateConfig + tags: + - Config + /api/v1/auth/config/version: + post: + description: Show master controller version + operationId: MCVersion + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiVersion' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: MCVersion + tags: + - Config + /api/v1/auth/controller/create: + post: + description: Create a new regional controller + operationId: CreateController + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiController' + x-required-fields: + - region + - address + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateController + tags: + - Controller + /api/v1/auth/controller/delete: + post: + description: Delete a regional controller + operationId: DeleteController + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiController' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteController + tags: + - Controller + /api/v1/auth/controller/show: + post: + description: Show regional controllers + operationId: ShowController + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiController' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiController' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowController + tags: + - Controller + /api/v1/auth/controller/update: + post: + description: Update region controller + operationId: UpdateController + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiController' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateController + tags: + - Controller + /api/v1/auth/ctrl/AccessCloudlet: + post: + description: Access Cloudlet VM + operationId: AccessCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionExecRequest' + x-required-fields: + - region + - execrequest.appinstkey.clusterinstkey.cloudletkey.organization + - execrequest.appinstkey.clusterinstkey.cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoExecRequest' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AccessCloudlet + tags: + - Exec + /api/v1/auth/ctrl/AddAppAlertPolicy: + post: + description: Add an AlertPolicy to the application definition + operationId: AddAppAlertPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppAlertPolicy' + x-required-fields: + - region + - appalertpolicy.appkey.organization + - appalertpolicy.appkey.name + - appalertpolicy.appkey.version + - appalertpolicy.alertpolicy + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddAppAlertPolicy + tags: + - App + /api/v1/auth/ctrl/AddAppAutoProvPolicy: + post: + description: Add an AutoProvPolicy to the application definition + operationId: AddAppAutoProvPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppAutoProvPolicy' + x-required-fields: + - region + - appautoprovpolicy.appkey.organization + - appautoprovpolicy.appkey.name + - appautoprovpolicy.appkey.version + - appautoprovpolicy.autoprovpolicy + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddAppAutoProvPolicy + tags: + - App + /api/v1/auth/ctrl/AddAutoProvPolicyCloudlet: + post: + description: Add a Cloudlet to the Auto Provisioning Policy + operationId: AddAutoProvPolicyCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoProvPolicyCloudlet' + x-required-fields: + - region + - autoprovpolicycloudlet.key.organization + - autoprovpolicycloudlet.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddAutoProvPolicyCloudlet + tags: + - AutoProvPolicy + /api/v1/auth/ctrl/AddCloudletAllianceOrg: + post: + description: Add alliance organization to the cloudlet + operationId: AddCloudletAllianceOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletAllianceOrg' + x-required-fields: + - region + - cloudletallianceorg.key.organization + - cloudletallianceorg.key.name + - cloudletallianceorg.organization + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddCloudletAllianceOrg + tags: + - Cloudlet + /api/v1/auth/ctrl/AddCloudletPoolMember: + post: + description: Add a Cloudlet to a CloudletPool + operationId: AddCloudletPoolMember + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletPoolMember' + x-required-fields: + - region + - cloudletpoolmember.key.organization + - cloudletpoolmember.key.name + - cloudletpoolmember.cloudlet.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddCloudletPoolMember + tags: + - CloudletPool + /api/v1/auth/ctrl/AddCloudletResMapping: + post: + description: Add Optional Resource tag table + operationId: AddCloudletResMapping + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletResMap' + x-required-fields: + - region + - cloudletresmap.key.organization + - cloudletresmap.key.name + - cloudletresmap.mapping + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddCloudletResMapping + tags: + - Cloudlet + /api/v1/auth/ctrl/AddFlavorRes: + post: + description: Add Optional Resource + operationId: AddFlavorRes + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlavor' + x-required-fields: + - region + - flavor.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddFlavorRes + tags: + - Flavor + /api/v1/auth/ctrl/AddGPUDriverBuild: + post: + description: Add GPU Driver Build. Adds new build to GPU driver. + operationId: AddGPUDriverBuild + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriverBuildMember' + x-required-fields: + - region + - gpudriverbuildmember.key.name + - gpudriverbuildmember.key.organization + - gpudriverbuildmember.build.name + - gpudriverbuildmember.build.driverpath + - gpudriverbuildmember.build.operatingsystem + - gpudriverbuildmember.build.md5sum + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddGPUDriverBuild + tags: + - GPUDriver + /api/v1/auth/ctrl/AddResTag: + post: + description: Add new tag(s) to TagTable + operationId: AddResTag + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionResTagTable' + x-required-fields: + - region + - restagtable.key.name + - restagtable.key.organization + - restagtable.tags + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddResTag + tags: + - ResTagTable + /api/v1/auth/ctrl/AddVMPoolMember: + post: + description: Add VMPoolMember. Adds a VM to existing VM Pool. + operationId: AddVMPoolMember + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionVMPoolMember' + x-required-fields: + - region + - vmpoolmember.key.organization + - vmpoolmember.key.name + - vmpoolmember.vm.name + - vmpoolmember.vm.netinfo.internalip + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddVMPoolMember + tags: + - VMPool + /api/v1/auth/ctrl/CreateAlertPolicy: + post: + description: Create an Alert Policy + operationId: CreateAlertPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAlertPolicy' + x-required-fields: + - region + - alertpolicy.key.organization + - alertpolicy.key.name + - alertpolicy.severity + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateAlertPolicy + tags: + - AlertPolicy + /api/v1/auth/ctrl/CreateApp: + post: + description: Create Application. Creates a definition for an application for + Cloudlet deployment. + operationId: CreateApp + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionApp' + x-required-fields: + - region + - app.key.organization + - app.key.name + - app.key.version + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateApp + tags: + - App + /api/v1/auth/ctrl/CreateAppInst: + post: + description: Create Application Instance. Creates an instance of an App on a + Cloudlet where it is defined by an App plus a ClusterInst key. Many of the + fields here are inherited from the App definition. + operationId: CreateAppInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInst' + x-required-fields: + - region + - appinst.key.appkey.organization + - appinst.key.appkey.name + - appinst.key.appkey.version + - appinst.key.clusterinstkey.cloudletkey.organization + - appinst.key.clusterinstkey.cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateAppInst + tags: + - AppInst + /api/v1/auth/ctrl/CreateAutoProvPolicy: + post: + description: Create an Auto Provisioning Policy + operationId: CreateAutoProvPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoProvPolicy' + x-required-fields: + - region + - autoprovpolicy.key.organization + - autoprovpolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateAutoProvPolicy + tags: + - AutoProvPolicy + /api/v1/auth/ctrl/CreateAutoScalePolicy: + post: + description: Create an Auto Scale Policy + operationId: CreateAutoScalePolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoScalePolicy' + x-required-fields: + - region + - autoscalepolicy.key.organization + - autoscalepolicy.key.name + - autoscalepolicy.minnodes + - autoscalepolicy.maxnodes + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateAutoScalePolicy + tags: + - AutoScalePolicy + /api/v1/auth/ctrl/CreateCloudlet: + post: + description: Create Cloudlet. Sets up Cloudlet services on the Operators compute + resources, and integrated as part of EdgeCloud edge resource portfolio. These + resources are managed from the Edge Controller. + operationId: CreateCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudlet' + x-required-fields: + - region + - cloudlet.key.organization + - cloudlet.key.name + - cloudlet.location.latitude + - cloudlet.location.longitude + - cloudlet.numdynamicips + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateCloudlet + tags: + - Cloudlet + /api/v1/auth/ctrl/CreateCloudletPool: + post: + description: Create a CloudletPool + operationId: CreateCloudletPool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletPool' + x-required-fields: + - region + - cloudletpool.key.organization + - cloudletpool.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateCloudletPool + tags: + - CloudletPool + /api/v1/auth/ctrl/CreateClusterInst: + post: + description: Create Cluster Instance. Creates an instance of a Cluster on a + Cloudlet, defined by a Cluster Key and a Cloudlet Key. ClusterInst is a collection + of compute resources on a Cloudlet on which AppInsts are deployed. + operationId: CreateClusterInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterInst' + x-required-fields: + - region + - clusterinst.key.clusterkey.name + - clusterinst.key.cloudletkey.organization + - clusterinst.key.cloudletkey.name + - clusterinst.key.organization + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateClusterInst + tags: + - ClusterInst + /api/v1/auth/ctrl/CreateFlavor: + post: + description: Create a Flavor + operationId: CreateFlavor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlavor' + x-required-fields: + - region + - flavor.key.name + - flavor.ram + - flavor.vcpus + - flavor.disk + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateFlavor + tags: + - Flavor + /api/v1/auth/ctrl/CreateFlowRateLimitSettings: + post: + description: Create Flow RateLimit settings for an API endpoint and target + operationId: CreateFlowRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlowRateLimitSettings' + x-required-fields: + - region + - flowratelimitsettings.key.flowsettingsname + - flowratelimitsettings.key.ratelimitkey.apiname + - flowratelimitsettings.key.ratelimitkey.apiendpointtype + - flowratelimitsettings.key.ratelimitkey.ratelimittarget + - flowratelimitsettings.settings.flowalgorithm + - flowratelimitsettings.settings.reqspersecond + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateFlowRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/CreateGPUDriver: + post: + description: Create GPU Driver. Creates GPU driver with all the config required + to install it. + operationId: CreateGPUDriver + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriver' + x-required-fields: + - region + - gpudriver.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateGPUDriver + tags: + - GPUDriver + /api/v1/auth/ctrl/CreateMaxReqsRateLimitSettings: + post: + description: Create MaxReqs RateLimit settings for an API endpoint and target + operationId: CreateMaxReqsRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionMaxReqsRateLimitSettings' + x-required-fields: + - region + - maxreqsratelimitsettings.key.maxreqssettingsname + - maxreqsratelimitsettings.key.ratelimitkey.apiname + - maxreqsratelimitsettings.key.ratelimitkey.apiendpointtype + - maxreqsratelimitsettings.key.ratelimitkey.ratelimittarget + - maxreqsratelimitsettings.settings.maxreqsalgorithm + - maxreqsratelimitsettings.settings.maxrequests + - maxreqsratelimitsettings.settings.interval + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateMaxReqsRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/CreateNetwork: + post: + description: Create a Network + operationId: CreateNetwork + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionNetwork' + x-required-fields: + - region + - network.key.cloudletkey.organization + - network.key.cloudletkey.name + - network.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateNetwork + tags: + - Network + /api/v1/auth/ctrl/CreateOperatorCode: + post: + description: Create Operator Code. Create a code for an Operator. + operationId: CreateOperatorCode + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionOperatorCode' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateOperatorCode + tags: + - OperatorCode + /api/v1/auth/ctrl/CreateResTagTable: + post: + description: Create TagTable + operationId: CreateResTagTable + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionResTagTable' + x-required-fields: + - region + - restagtable.key.name + - restagtable.key.organization + - restagtable.tags + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateResTagTable + tags: + - ResTagTable + /api/v1/auth/ctrl/CreateTrustPolicy: + post: + description: Create a Trust Policy + operationId: CreateTrustPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionTrustPolicy' + x-required-fields: + - region + - trustpolicy.key.organization + - trustpolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateTrustPolicy + tags: + - TrustPolicy + /api/v1/auth/ctrl/CreateTrustPolicyException: + post: + description: Create a Trust Policy Exception, by App Developer Organization + operationId: CreateTrustPolicyException + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionTrustPolicyException' + x-required-fields: + - region + - trustpolicyexception.key.appkey.organization + - trustpolicyexception.key.appkey.name + - trustpolicyexception.key.appkey.version + - trustpolicyexception.key.cloudletpoolkey.organization + - trustpolicyexception.key.cloudletpoolkey.name + - trustpolicyexception.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateTrustPolicyException + tags: + - TrustPolicyException + /api/v1/auth/ctrl/CreateVMPool: + post: + description: Create VMPool. Creates VM pool which will have VMs defined. + operationId: CreateVMPool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionVMPool' + x-required-fields: + - region + - vmpool.key.organization + - vmpool.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateVMPool + tags: + - VMPool + /api/v1/auth/ctrl/DeleteAlertPolicy: + post: + description: Delete an Alert Policy + operationId: DeleteAlertPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAlertPolicy' + x-required-fields: + - region + - alertpolicy.key.organization + - alertpolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteAlertPolicy + tags: + - AlertPolicy + /api/v1/auth/ctrl/DeleteApp: + post: + description: Delete Application. Deletes a definition of an application. Instances + of the application must be deleted first. + operationId: DeleteApp + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionApp' + x-required-fields: + - region + - app.key.organization + - app.key.name + - app.key.version + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteApp + tags: + - App + /api/v1/auth/ctrl/DeleteAppInst: + post: + description: Delete Application Instance. Deletes an instance of the App from + the Cloudlet. + operationId: DeleteAppInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInst' + x-required-fields: + - region + - appinst.key.appkey.organization + - appinst.key.appkey.name + - appinst.key.appkey.version + - appinst.key.clusterinstkey.cloudletkey.organization + - appinst.key.clusterinstkey.cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteAppInst + tags: + - AppInst + /api/v1/auth/ctrl/DeleteAutoProvPolicy: + post: + description: Delete an Auto Provisioning Policy + operationId: DeleteAutoProvPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoProvPolicy' + x-required-fields: + - region + - autoprovpolicy.key.organization + - autoprovpolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteAutoProvPolicy + tags: + - AutoProvPolicy + /api/v1/auth/ctrl/DeleteAutoScalePolicy: + post: + description: Delete an Auto Scale Policy + operationId: DeleteAutoScalePolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoScalePolicy' + x-required-fields: + - region + - autoscalepolicy.key.organization + - autoscalepolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteAutoScalePolicy + tags: + - AutoScalePolicy + /api/v1/auth/ctrl/DeleteCloudlet: + post: + description: Delete Cloudlet. Removes the Cloudlet services where they are no + longer managed from the Edge Controller. + operationId: DeleteCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudlet' + x-required-fields: + - region + - cloudlet.key.organization + - cloudlet.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteCloudlet + tags: + - Cloudlet + /api/v1/auth/ctrl/DeleteCloudletPool: + post: + description: Delete a CloudletPool + operationId: DeleteCloudletPool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletPool' + x-required-fields: + - region + - cloudletpool.key.organization + - cloudletpool.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteCloudletPool + tags: + - CloudletPool + /api/v1/auth/ctrl/DeleteClusterInst: + post: + description: Delete Cluster Instance. Deletes an instance of a Cluster deployed + on a Cloudlet. + operationId: DeleteClusterInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterInst' + x-required-fields: + - region + - clusterinst.key.clusterkey.name + - clusterinst.key.cloudletkey.organization + - clusterinst.key.cloudletkey.name + - clusterinst.key.organization + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteClusterInst + tags: + - ClusterInst + /api/v1/auth/ctrl/DeleteFlavor: + post: + description: Delete a Flavor + operationId: DeleteFlavor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlavor' + x-required-fields: + - region + - flavor.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteFlavor + tags: + - Flavor + /api/v1/auth/ctrl/DeleteFlowRateLimitSettings: + post: + description: Delete Flow RateLimit settings for an API endpoint and target + operationId: DeleteFlowRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlowRateLimitSettings' + x-required-fields: + - region + - flowratelimitsettings.key.flowsettingsname + - flowratelimitsettings.key.ratelimitkey.apiname + - flowratelimitsettings.key.ratelimitkey.apiendpointtype + - flowratelimitsettings.key.ratelimitkey.ratelimittarget + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteFlowRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/DeleteGPUDriver: + post: + description: Delete GPU Driver. Deletes GPU driver given that it is not used + by any cloudlet. + operationId: DeleteGPUDriver + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriver' + x-required-fields: + - region + - gpudriver.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteGPUDriver + tags: + - GPUDriver + /api/v1/auth/ctrl/DeleteIdleReservableClusterInsts: + post: + description: Cleanup Reservable Cluster Instances. Deletes reservable cluster + instances that are not in use. + operationId: DeleteIdleReservableClusterInsts + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionIdleReservableClusterInsts' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteIdleReservableClusterInsts + tags: + - ClusterInst + /api/v1/auth/ctrl/DeleteMaxReqsRateLimitSettings: + post: + description: Delete MaxReqs RateLimit settings for an API endpoint and target + operationId: DeleteMaxReqsRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionMaxReqsRateLimitSettings' + x-required-fields: + - region + - maxreqsratelimitsettings.key.maxreqssettingsname + - maxreqsratelimitsettings.key.ratelimitkey.apiname + - maxreqsratelimitsettings.key.ratelimitkey.apiendpointtype + - maxreqsratelimitsettings.key.ratelimitkey.ratelimittarget + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteMaxReqsRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/DeleteNetwork: + post: + description: Delete a Network + operationId: DeleteNetwork + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionNetwork' + x-required-fields: + - region + - network.key.cloudletkey.organization + - network.key.cloudletkey.name + - network.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteNetwork + tags: + - Network + /api/v1/auth/ctrl/DeleteOperatorCode: + post: + description: Delete Operator Code. Delete a code for an Operator. + operationId: DeleteOperatorCode + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionOperatorCode' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteOperatorCode + tags: + - OperatorCode + /api/v1/auth/ctrl/DeleteResTagTable: + post: + description: Delete TagTable + operationId: DeleteResTagTable + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionResTagTable' + x-required-fields: + - region + - restagtable.key.name + - restagtable.key.organization + - restagtable.tags + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteResTagTable + tags: + - ResTagTable + /api/v1/auth/ctrl/DeleteTrustPolicy: + post: + description: Delete a Trust policy + operationId: DeleteTrustPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionTrustPolicy' + x-required-fields: + - region + - trustpolicy.key.organization + - trustpolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteTrustPolicy + tags: + - TrustPolicy + /api/v1/auth/ctrl/DeleteTrustPolicyException: + post: + description: Delete a Trust Policy Exception, by App Developer Organization + operationId: DeleteTrustPolicyException + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionTrustPolicyException' + x-required-fields: + - region + - trustpolicyexception.key.appkey.organization + - trustpolicyexception.key.appkey.name + - trustpolicyexception.key.appkey.version + - trustpolicyexception.key.cloudletpoolkey.organization + - trustpolicyexception.key.cloudletpoolkey.name + - trustpolicyexception.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteTrustPolicyException + tags: + - TrustPolicyException + /api/v1/auth/ctrl/DeleteVMPool: + post: + description: Delete VMPool. Deletes VM pool given that none of VMs part of this + pool is used. + operationId: DeleteVMPool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionVMPool' + x-required-fields: + - region + - vmpool.key.organization + - vmpool.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteVMPool + tags: + - VMPool + /api/v1/auth/ctrl/DisableDebugLevels: + post: + description: Disable debug log levels + operationId: DisableDebugLevels + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDebugRequest' + x-required-fields: + - debugrequest.levels + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoDebugReply' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DisableDebugLevels + tags: + - Debug + /api/v1/auth/ctrl/EnableDebugLevels: + post: + description: Enable debug log levels + operationId: EnableDebugLevels + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDebugRequest' + x-required-fields: + - debugrequest.levels + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoDebugReply' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: EnableDebugLevels + tags: + - Debug + /api/v1/auth/ctrl/EvictCloudletInfo: + post: + description: Evict (delete) a CloudletInfo for regression testing + operationId: EvictCloudletInfo + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletInfo' + x-required-fields: + - region + - cloudletinfo.key.organization + - cloudletinfo.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: EvictCloudletInfo + tags: + - CloudletInfo + /api/v1/auth/ctrl/EvictDevice: + post: + description: Evict a device + operationId: EvictDevice + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDevice' + x-required-fields: + - region + - device.key.uniqueidtype + - device.key.uniqueid + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: EvictDevice + tags: + - Device + /api/v1/auth/ctrl/FindFlavorMatch: + post: + description: Discover if flavor produces a matching platform flavor + operationId: FindFlavorMatch + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlavorMatch' + x-required-fields: + - region + - flavormatch.key.organization + - flavormatch.key.name + - flavormatch.flavorname + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoFlavorMatch' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: FindFlavorMatch + tags: + - Cloudlet + /api/v1/auth/ctrl/GenerateAccessKey: + post: + description: Generate new crm access key + operationId: GenerateAccessKey + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletKey' + x-required-fields: + - region + - cloudletkey.organization + - cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GenerateAccessKey + tags: + - Cloudlet + /api/v1/auth/ctrl/GetCloudletGPUDriverLicenseConfig: + post: + description: Get Cloudlet Specific GPU Driver License Config. Returns the license + config associated with the cloudlet + operationId: GetCloudletGPUDriverLicenseConfig + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletKey' + x-required-fields: + - region + - cloudletkey.organization + - cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetCloudletGPUDriverLicenseConfig + tags: + - Cloudlet + /api/v1/auth/ctrl/GetCloudletManifest: + post: + description: Get Cloudlet Manifest. Shows deployment manifest required to setup + cloudlet + operationId: GetCloudletManifest + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletKey' + x-required-fields: + - region + - cloudletkey.organization + - cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudletManifest' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetCloudletManifest + tags: + - Cloudlet + /api/v1/auth/ctrl/GetCloudletProps: + post: + description: Get Cloudlet Properties. Shows all the infra properties used to + setup cloudlet + operationId: GetCloudletProps + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletProps' + x-required-fields: + - region + - cloudletprops.platformtype + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudletProps' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetCloudletProps + tags: + - Cloudlet + /api/v1/auth/ctrl/GetCloudletResourceQuotaProps: + post: + description: Get Cloudlet Resource Quota Properties. Shows all the resource + quota properties of the cloudlet + operationId: GetCloudletResourceQuotaProps + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletResourceQuotaProps' + x-required-fields: + - region + - cloudletresourcequotaprops.platformtype + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudletResourceQuotaProps' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetCloudletResourceQuotaProps + tags: + - Cloudlet + /api/v1/auth/ctrl/GetCloudletResourceUsage: + post: + description: Get Cloudlet resource information. Shows cloudlet resources used + and their limits + operationId: GetCloudletResourceUsage + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletResourceUsage' + x-required-fields: + - region + - cloudletresourceusage.key.organization + - cloudletresourceusage.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudletResourceUsage' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetCloudletResourceUsage + tags: + - Cloudlet + /api/v1/auth/ctrl/GetGPUDriverBuildURL: + post: + description: Get GPU Driver Build URL. Returns a time-limited signed URL to + download GPU driver. + operationId: GetGPUDriverBuildURL + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriverBuildMember' + x-required-fields: + - region + - gpudriverbuildmember.key.name + - gpudriverbuildmember.key.organization + - gpudriverbuildmember.build.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoGPUDriverBuildURL' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetGPUDriverBuildURL + tags: + - GPUDriver + /api/v1/auth/ctrl/GetGPUDriverLicenseConfig: + post: + description: Get GPU Driver License Config. Returns the license config specific + to GPU driver + operationId: GetGPUDriverLicenseConfig + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriverKey' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetGPUDriverLicenseConfig + tags: + - GPUDriver + /api/v1/auth/ctrl/GetOrganizationsOnCloudlet: + post: + description: Get organizations of ClusterInsts and AppInsts on cloudlet + operationId: GetOrganizationsOnCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletKey' + x-required-fields: + - region + - cloudletkey.organization + - cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoOrganization' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetOrganizationsOnCloudlet + tags: + - Cloudlet + /api/v1/auth/ctrl/GetResTagTable: + post: + description: Fetch a copy of the TagTable + operationId: GetResTagTable + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionResTagTableKey' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResTagTable' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GetResTagTable + tags: + - ResTagTable + /api/v1/auth/ctrl/InjectCloudletInfo: + post: + description: Inject (create) a CloudletInfo for regression testing + operationId: InjectCloudletInfo + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletInfo' + x-required-fields: + - region + - cloudletinfo.key.organization + - cloudletinfo.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: InjectCloudletInfo + tags: + - CloudletInfo + /api/v1/auth/ctrl/InjectDevice: + post: + description: Inject a device + operationId: InjectDevice + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDevice' + x-required-fields: + - region + - device.key.uniqueidtype + - device.key.uniqueid + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: InjectDevice + tags: + - Device + /api/v1/auth/ctrl/RefreshAppInst: + post: + description: Refresh Application Instance. Restarts an App instance with new + App settings or image. + operationId: RefreshAppInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInst' + x-required-fields: + - region + - appinst.key.appkey.organization + - appinst.key.appkey.name + - appinst.key.appkey.version + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RefreshAppInst + tags: + - AppInst + /api/v1/auth/ctrl/RemoveAppAlertPolicy: + post: + description: Remove an AlertPolicy from the application definition + operationId: RemoveAppAlertPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppAlertPolicy' + x-required-fields: + - region + - appalertpolicy.appkey.organization + - appalertpolicy.appkey.name + - appalertpolicy.appkey.version + - appalertpolicy.alertpolicy + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveAppAlertPolicy + tags: + - App + /api/v1/auth/ctrl/RemoveAppAutoProvPolicy: + post: + description: Remove an AutoProvPolicy from the application definition + operationId: RemoveAppAutoProvPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppAutoProvPolicy' + x-required-fields: + - region + - appautoprovpolicy.appkey.organization + - appautoprovpolicy.appkey.name + - appautoprovpolicy.appkey.version + - appautoprovpolicy.autoprovpolicy + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveAppAutoProvPolicy + tags: + - App + /api/v1/auth/ctrl/RemoveAutoProvPolicyCloudlet: + post: + description: Remove a Cloudlet from the Auto Provisioning Policy + operationId: RemoveAutoProvPolicyCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoProvPolicyCloudlet' + x-required-fields: + - region + - autoprovpolicycloudlet.key.organization + - autoprovpolicycloudlet.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveAutoProvPolicyCloudlet + tags: + - AutoProvPolicy + /api/v1/auth/ctrl/RemoveCloudletAllianceOrg: + post: + description: Remove alliance organization from the cloudlet + operationId: RemoveCloudletAllianceOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletAllianceOrg' + x-required-fields: + - region + - cloudletallianceorg.key.organization + - cloudletallianceorg.key.name + - cloudletallianceorg.organization + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveCloudletAllianceOrg + tags: + - Cloudlet + /api/v1/auth/ctrl/RemoveCloudletPoolMember: + post: + description: Remove a Cloudlet from a CloudletPool + operationId: RemoveCloudletPoolMember + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletPoolMember' + x-required-fields: + - region + - cloudletpoolmember.key.organization + - cloudletpoolmember.key.name + - cloudletpoolmember.cloudlet.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveCloudletPoolMember + tags: + - CloudletPool + /api/v1/auth/ctrl/RemoveCloudletResMapping: + post: + description: Remove Optional Resource tag table + operationId: RemoveCloudletResMapping + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletResMap' + x-required-fields: + - region + - cloudletresmap.key.organization + - cloudletresmap.key.name + - cloudletresmap.mapping + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveCloudletResMapping + tags: + - Cloudlet + /api/v1/auth/ctrl/RemoveFlavorRes: + post: + description: Remove Optional Resource + operationId: RemoveFlavorRes + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlavor' + x-required-fields: + - region + - flavor.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveFlavorRes + tags: + - Flavor + /api/v1/auth/ctrl/RemoveGPUDriverBuild: + post: + description: Remove GPU Driver Build. Removes build from GPU driver. + operationId: RemoveGPUDriverBuild + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriverBuildMember' + x-required-fields: + - region + - gpudriverbuildmember.key.name + - gpudriverbuildmember.key.organization + - gpudriverbuildmember.build.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveGPUDriverBuild + tags: + - GPUDriver + /api/v1/auth/ctrl/RemoveResTag: + post: + description: Remove existing tag(s) from TagTable + operationId: RemoveResTag + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionResTagTable' + x-required-fields: + - region + - restagtable.key.name + - restagtable.key.organization + - restagtable.tags + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveResTag + tags: + - ResTagTable + /api/v1/auth/ctrl/RemoveVMPoolMember: + post: + description: Remove VMPoolMember. Removes a VM from existing VM Pool. + operationId: RemoveVMPoolMember + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionVMPoolMember' + x-required-fields: + - region + - vmpoolmember.key.organization + - vmpoolmember.key.name + - vmpoolmember.vm.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveVMPoolMember + tags: + - VMPool + /api/v1/auth/ctrl/RequestAppInstLatency: + post: + description: Request Latency measurements for clients connected to AppInst + operationId: RequestAppInstLatency + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInstLatency' + x-required-fields: + - region + - appinstlatency.key.appkey.organization + - appinstlatency.key.appkey.name + - appinstlatency.key.appkey.version + - appinstlatency.key.clusterinstkey.cloudletkey.organization + - appinstlatency.key.clusterinstkey.cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RequestAppInstLatency + tags: + - AppInstLatency + /api/v1/auth/ctrl/ResetSettings: + post: + description: Reset all settings to their defaults + operationId: ResetSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionSettings' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ResetSettings + tags: + - Settings + /api/v1/auth/ctrl/RevokeAccessKey: + post: + description: Revoke crm access key + operationId: RevokeAccessKey + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletKey' + x-required-fields: + - region + - cloudletkey.organization + - cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RevokeAccessKey + tags: + - Cloudlet + /api/v1/auth/ctrl/RunCommand: + post: + description: Run a Command or Shell on a container + operationId: RunCommand + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionExecRequest' + x-required-fields: + - region + - execrequest.appinstkey.appkey.organization + - execrequest.appinstkey.appkey.name + - execrequest.appinstkey.appkey.version + - execrequest.appinstkey.clusterinstkey.clusterkey.name + - execrequest.appinstkey.clusterinstkey.cloudletkey.organization + - execrequest.appinstkey.clusterinstkey.cloudletkey.name + - execrequest.cmd.command + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoExecRequest' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RunCommand + tags: + - Exec + /api/v1/auth/ctrl/RunConsole: + post: + description: Run console on a VM + operationId: RunConsole + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionExecRequest' + x-required-fields: + - region + - execrequest.appinstkey.appkey.organization + - execrequest.appinstkey.appkey.name + - execrequest.appinstkey.appkey.version + - execrequest.appinstkey.clusterinstkey.cloudletkey.organization + - execrequest.appinstkey.clusterinstkey.cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoExecRequest' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RunConsole + tags: + - Exec + /api/v1/auth/ctrl/RunDebug: + post: + description: Run debug command + operationId: RunDebug + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDebugRequest' + x-required-fields: + - debugrequest.cmd + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoDebugReply' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RunDebug + tags: + - Debug + /api/v1/auth/ctrl/ShowAlert: + post: + description: Show alerts + operationId: ShowAlert + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAlert' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoAlert' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAlert + tags: + - Alert + /api/v1/auth/ctrl/ShowAlertPolicy: + post: + description: Show Alert Policies. Any fields specified will be used to filter + results. + operationId: ShowAlertPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAlertPolicy' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoAlertPolicy' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAlertPolicy + tags: + - AlertPolicy + /api/v1/auth/ctrl/ShowApp: + post: + description: Show Applications. Lists all application definitions. Any fields + specified will be used to filter results. + operationId: ShowApp + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionApp' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoApp' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowApp + tags: + - App + /api/v1/auth/ctrl/ShowAppInst: + post: + description: Show Application Instances. Lists all the Application instances + managed by the Edge Controller. Any fields specified will be used to filter + results. + operationId: ShowAppInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInst' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoAppInst' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAppInst + tags: + - AppInst + /api/v1/auth/ctrl/ShowAppInstClient: + post: + description: Show application instance clients. + operationId: ShowAppInstClient + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInstClientKey' + x-required-fields: + - region + - appinstclientkey.appinstkey.appkey.organization + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoAppInstClient' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAppInstClient + tags: + - AppInstClient + /api/v1/auth/ctrl/ShowAppInstRefs: + post: + description: Show AppInstRefs (debug only) + operationId: ShowAppInstRefs + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInstRefs' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoAppInstRefs' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAppInstRefs + tags: + - AppInstRefs + /api/v1/auth/ctrl/ShowAutoProvPolicy: + post: + description: Show Auto Provisioning Policies. Any fields specified will be used + to filter results. + operationId: ShowAutoProvPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoProvPolicy' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoAutoProvPolicy' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAutoProvPolicy + tags: + - AutoProvPolicy + /api/v1/auth/ctrl/ShowAutoScalePolicy: + post: + description: Show Auto Scale Policies. Any fields specified will be used to + filter results. + operationId: ShowAutoScalePolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoScalePolicy' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoAutoScalePolicy' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAutoScalePolicy + tags: + - AutoScalePolicy + /api/v1/auth/ctrl/ShowCloudlet: + post: + description: Show Cloudlets. Lists all the cloudlets managed from Edge Controller. + operationId: ShowCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudlet' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudlet' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudlet + tags: + - Cloudlet + /api/v1/auth/ctrl/ShowCloudletInfo: + post: + description: Show CloudletInfos + operationId: ShowCloudletInfo + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletInfo' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudletInfo' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletInfo + tags: + - CloudletInfo + /api/v1/auth/ctrl/ShowCloudletPool: + post: + description: Show CloudletPools + operationId: ShowCloudletPool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletPool' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudletPool' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletPool + tags: + - CloudletPool + /api/v1/auth/ctrl/ShowCloudletRefs: + post: + description: Show CloudletRefs (debug only) + operationId: ShowCloudletRefs + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletRefs' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudletRefs' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletRefs + tags: + - CloudletRefs + /api/v1/auth/ctrl/ShowCloudletsForAppDeployment: + post: + description: Discover cloudlets supporting deployments of App.DefaultFlavor + operationId: ShowCloudletsForAppDeployment + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDeploymentCloudletRequest' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletsForAppDeployment + tags: + - App + /api/v1/auth/ctrl/ShowClusterInst: + post: + description: Show Cluster Instances. Lists all the cluster instances managed + by Edge Controller. + operationId: ShowClusterInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterInst' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoClusterInst' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowClusterInst + tags: + - ClusterInst + /api/v1/auth/ctrl/ShowClusterRefs: + post: + description: Show ClusterRefs (debug only) + operationId: ShowClusterRefs + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterRefs' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoClusterRefs' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowClusterRefs + tags: + - ClusterRefs + /api/v1/auth/ctrl/ShowDebugLevels: + post: + description: Show debug log levels + operationId: ShowDebugLevels + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDebugRequest' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoDebugReply' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowDebugLevels + tags: + - Debug + /api/v1/auth/ctrl/ShowDevice: + post: + description: Show devices + operationId: ShowDevice + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDevice' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoDevice' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowDevice + tags: + - Device + /api/v1/auth/ctrl/ShowDeviceReport: + post: + description: Device Reports API. + operationId: ShowDeviceReport + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionDeviceReport' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoDevice' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowDeviceReport + tags: + - Device + /api/v1/auth/ctrl/ShowFlavor: + post: + description: Show Flavors + operationId: ShowFlavor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlavor' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoFlavor' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowFlavor + tags: + - Flavor + /api/v1/auth/ctrl/ShowFlavorsForCloudlet: + post: + description: Find all meta flavors viable on cloudlet + operationId: ShowFlavorsForCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletKey' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoFlavorKey' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowFlavorsForCloudlet + tags: + - Cloudlet + /api/v1/auth/ctrl/ShowFlowRateLimitSettings: + post: + description: Show Flow RateLimit settings for an API endpoint and target + operationId: ShowFlowRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlowRateLimitSettings' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoFlowRateLimitSettings' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowFlowRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/ShowGPUDriver: + post: + description: Show GPU Drivers. Lists all the EdgeCloud created GPU drivers and + operator created GPU drivers. + operationId: ShowGPUDriver + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriver' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoGPUDriver' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowGPUDriver + tags: + - GPUDriver + /api/v1/auth/ctrl/ShowLogs: + post: + description: View logs for AppInst + operationId: ShowLogs + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionExecRequest' + x-required-fields: + - region + - execrequest.appinstkey.appkey.organization + - execrequest.appinstkey.appkey.name + - execrequest.appinstkey.appkey.version + - execrequest.appinstkey.clusterinstkey.clusterkey.name + - execrequest.appinstkey.clusterinstkey.cloudletkey.organization + - execrequest.appinstkey.clusterinstkey.cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoExecRequest' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowLogs + tags: + - Exec + /api/v1/auth/ctrl/ShowMaxReqsRateLimitSettings: + post: + description: Show MaxReqs RateLimit settings for an API endpoint and target + operationId: ShowMaxReqsRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionMaxReqsRateLimitSettings' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoMaxReqsRateLimitSettings' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowMaxReqsRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/ShowNetwork: + post: + description: Show Networks. Any fields specified will be used to filter results. + operationId: ShowNetwork + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionNetwork' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoNetwork' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowNetwork + tags: + - Network + /api/v1/auth/ctrl/ShowNode: + post: + description: Show all Nodes connected to all Controllers + operationId: ShowNode + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionNode' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoNode' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowNode + tags: + - Node + /api/v1/auth/ctrl/ShowOperatorCode: + post: + description: Show Operator Code. Show Codes for an Operator. + operationId: ShowOperatorCode + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionOperatorCode' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoOperatorCode' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowOperatorCode + tags: + - OperatorCode + /api/v1/auth/ctrl/ShowRateLimitSettings: + post: + description: Show RateLimit settings for an API endpoint and target + operationId: ShowRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionRateLimitSettings' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoRateLimitSettings' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/ShowResTagTable: + post: + description: Show TagTable + operationId: ShowResTagTable + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionResTagTable' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResTagTable' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowResTagTable + tags: + - ResTagTable + /api/v1/auth/ctrl/ShowSettings: + post: + description: Show settings + operationId: ShowSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionSettings' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoSettings' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowSettings + tags: + - Settings + /api/v1/auth/ctrl/ShowTrustPolicy: + post: + description: Show Trust Policies. Any fields specified will be used to filter + results. + operationId: ShowTrustPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionTrustPolicy' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoTrustPolicy' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowTrustPolicy + tags: + - TrustPolicy + /api/v1/auth/ctrl/ShowTrustPolicyException: + post: + description: Show Trust Policy Exceptions. Any fields specified will be used + to filter results. + operationId: ShowTrustPolicyException + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionTrustPolicyException' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoTrustPolicyException' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowTrustPolicyException + tags: + - TrustPolicyException + /api/v1/auth/ctrl/ShowVMPool: + post: + description: Show VMPools. Lists all the VMs part of the VM pool. + operationId: ShowVMPool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionVMPool' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoVMPool' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowVMPool + tags: + - VMPool + /api/v1/auth/ctrl/StreamAppInst: + post: + description: Stream Application Instance current progress + operationId: StreamAppInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInstKey' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: StreamAppInst + tags: + - StreamObj + /api/v1/auth/ctrl/StreamCloudlet: + post: + description: Stream Cloudlet current progress + operationId: StreamCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletKey' + x-required-fields: + - region + - cloudletkey.organization + - cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: StreamCloudlet + tags: + - StreamObj + /api/v1/auth/ctrl/StreamClusterInst: + post: + description: Stream Cluster Instance current progress + operationId: StreamClusterInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterInstKey' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: StreamClusterInst + tags: + - StreamObj + /api/v1/auth/ctrl/StreamGPUDriver: + post: + description: Stream GPU driver current progress + operationId: StreamGPUDriver + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriverKey' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: StreamGPUDriver + tags: + - StreamObj + /api/v1/auth/ctrl/UpdateAlertPolicy: + post: + description: Update an Alert Policy + operationId: UpdateAlertPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAlertPolicy' + x-required-fields: + - region + - alertpolicy.key.organization + - alertpolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateAlertPolicy + tags: + - AlertPolicy + /api/v1/auth/ctrl/UpdateApp: + post: + description: Update Application. Updates the definition of an application. + operationId: UpdateApp + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionApp' + x-required-fields: + - region + - app.key.organization + - app.key.name + - app.key.version + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateApp + tags: + - App + /api/v1/auth/ctrl/UpdateAppInst: + post: + description: Update Application Instance. Updates an Application instance and + then refreshes it. + operationId: UpdateAppInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInst' + x-required-fields: + - region + - appinst.key.appkey.organization + - appinst.key.appkey.name + - appinst.key.appkey.version + - appinst.key.clusterinstkey.cloudletkey.organization + - appinst.key.clusterinstkey.cloudletkey.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateAppInst + tags: + - AppInst + /api/v1/auth/ctrl/UpdateAutoProvPolicy: + post: + description: Update an Auto Provisioning Policy + operationId: UpdateAutoProvPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoProvPolicy' + x-required-fields: + - region + - autoprovpolicy.key.organization + - autoprovpolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateAutoProvPolicy + tags: + - AutoProvPolicy + /api/v1/auth/ctrl/UpdateAutoScalePolicy: + post: + description: Update an Auto Scale Policy + operationId: UpdateAutoScalePolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAutoScalePolicy' + x-required-fields: + - region + - autoscalepolicy.key.organization + - autoscalepolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateAutoScalePolicy + tags: + - AutoScalePolicy + /api/v1/auth/ctrl/UpdateCloudlet: + post: + description: Update Cloudlet. Updates the Cloudlet configuration and manages + the upgrade of Cloudlet services. + operationId: UpdateCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudlet' + x-required-fields: + - region + - cloudlet.key.organization + - cloudlet.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateCloudlet + tags: + - Cloudlet + /api/v1/auth/ctrl/UpdateCloudletPool: + post: + description: Update a CloudletPool + operationId: UpdateCloudletPool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletPool' + x-required-fields: + - region + - cloudletpool.key.organization + - cloudletpool.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateCloudletPool + tags: + - CloudletPool + /api/v1/auth/ctrl/UpdateClusterInst: + post: + description: Update Cluster Instance. Updates an instance of a Cluster deployed + on a Cloudlet. + operationId: UpdateClusterInst + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterInst' + x-required-fields: + - region + - clusterinst.key.clusterkey.name + - clusterinst.key.cloudletkey.organization + - clusterinst.key.cloudletkey.name + - clusterinst.key.organization + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateClusterInst + tags: + - ClusterInst + /api/v1/auth/ctrl/UpdateFlavor: + post: + description: Update a Flavor + operationId: UpdateFlavor + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlavor' + x-required-fields: + - region + - flavor.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateFlavor + tags: + - Flavor + /api/v1/auth/ctrl/UpdateFlowRateLimitSettings: + post: + description: Update Flow RateLimit settings for an API endpoint and target + operationId: UpdateFlowRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionFlowRateLimitSettings' + x-required-fields: + - region + - flowratelimitsettings.key.flowsettingsname + - flowratelimitsettings.key.ratelimitkey.apiname + - flowratelimitsettings.key.ratelimitkey.apiendpointtype + - flowratelimitsettings.key.ratelimitkey.ratelimittarget + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateFlowRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/UpdateGPUDriver: + post: + description: Update GPU Driver. Updates GPU driver config. + operationId: UpdateGPUDriver + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionGPUDriver' + x-required-fields: + - region + - gpudriver.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateGPUDriver + tags: + - GPUDriver + /api/v1/auth/ctrl/UpdateMaxReqsRateLimitSettings: + post: + description: Update MaxReqs RateLimit settings for an API endpoint and target + operationId: UpdateMaxReqsRateLimitSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionMaxReqsRateLimitSettings' + x-required-fields: + - region + - maxreqsratelimitsettings.key.maxreqssettingsname + - maxreqsratelimitsettings.key.ratelimitkey.apiname + - maxreqsratelimitsettings.key.ratelimitkey.apiendpointtype + - maxreqsratelimitsettings.key.ratelimitkey.ratelimittarget + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateMaxReqsRateLimitSettings + tags: + - RateLimitSettings + /api/v1/auth/ctrl/UpdateNetwork: + post: + description: Update a Network + operationId: UpdateNetwork + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionNetwork' + x-required-fields: + - region + - network.key.cloudletkey.organization + - network.key.cloudletkey.name + - network.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateNetwork + tags: + - Network + /api/v1/auth/ctrl/UpdateResTagTable: + post: + description: Update TagTable + operationId: UpdateResTagTable + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionResTagTable' + x-required-fields: + - region + - restagtable.key.name + - restagtable.key.organization + - restagtable.tags + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateResTagTable + tags: + - ResTagTable + /api/v1/auth/ctrl/UpdateSettings: + post: + description: Update settings + operationId: UpdateSettings + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionSettings' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateSettings + tags: + - Settings + /api/v1/auth/ctrl/UpdateTrustPolicy: + post: + description: Update a Trust policy + operationId: UpdateTrustPolicy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionTrustPolicy' + x-required-fields: + - region + - trustpolicy.key.organization + - trustpolicy.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateTrustPolicy + tags: + - TrustPolicy + /api/v1/auth/ctrl/UpdateTrustPolicyException: + post: + description: Update a Trust Policy Exception, by Operator Organization + operationId: UpdateTrustPolicyException + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionTrustPolicyException' + x-required-fields: + - region + - trustpolicyexception.key.appkey.organization + - trustpolicyexception.key.appkey.name + - trustpolicyexception.key.appkey.version + - trustpolicyexception.key.cloudletpoolkey.organization + - trustpolicyexception.key.cloudletpoolkey.name + - trustpolicyexception.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateTrustPolicyException + tags: + - TrustPolicyException + /api/v1/auth/ctrl/UpdateVMPool: + post: + description: Update VMPool. Updates a VM pools VMs. + operationId: UpdateVMPool + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionVMPool' + x-required-fields: + - region + - vmpool.key.organization + - vmpool.key.name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeprotoResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateVMPool + tags: + - VMPool + /api/v1/auth/events/app: + post: + description: View App billing events + operationId: ShowAppEvents + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInstEvents' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAppEvents + tags: + - BillingEvents + /api/v1/auth/events/cloudlet: + post: + description: View Cloudlet billing events + operationId: ShowCloudletEvents + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletEvents' + x-required-fields: + - region + - cloudlet.organization + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletEvents + tags: + - BillingEvents + /api/v1/auth/events/cluster: + post: + description: View ClusterInst billing events + operationId: ShowClusterEvents + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterInstEvents' + x-required-fields: + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowClusterEvents + tags: + - BillingEvents + /api/v1/auth/events/find: + post: + description: Find events and audit events, results sorted by relevance + operationId: FindEvents + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/NodeEventSearch' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/NodeEventData' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: FindEvents + tags: + - Events + /api/v1/auth/events/show: + post: + description: Show events and audit events + operationId: ShowEvents + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/NodeEventSearch' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/NodeEventData' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowEvents + tags: + - Events + /api/v1/auth/events/terms: + post: + description: Show aggregated events terms + operationId: EventTerms + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/NodeEventSearch' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/NodeEventTerms' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: EventTerms + tags: + - Events + /api/v1/auth/federation/create: + post: + description: Create Federation + operationId: CreateFederation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederation' + x-required-fields: + - selfoperatorid + - selffederationid + - name + - federator.operatorid + - federator.countrycode + - federator.federationid + - federator.federationaddr + - federator.apikey + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateFederation + tags: + - Federation + /api/v1/auth/federation/delete: + post: + description: Delete Federation + operationId: DeleteFederation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederation' + x-required-fields: + - selfoperatorid + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteFederation + tags: + - Federation + /api/v1/auth/federation/deregister: + post: + description: Deregister Federation + operationId: DeregisterFederation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederation' + x-required-fields: + - selfoperatorid + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeregisterFederation + tags: + - Federation + /api/v1/auth/federation/partner/setapikey: + post: + description: Set Partner Federation API Key + operationId: SetPartnerFederationAPIKey + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederation' + x-required-fields: + - selfoperatorid + - name + - federator.apikey + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: SetPartnerFederationAPIKey + tags: + - Federation + /api/v1/auth/federation/partner/zone/show: + post: + description: Show Federated Partner Zones + operationId: ShowFederatedPartnerZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatedPartnerZone' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiFederatedPartnerZone' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowFederatedPartnerZone + tags: + - FederatorZone + /api/v1/auth/federation/register: + post: + description: Register Federation + operationId: RegisterFederation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederation' + x-required-fields: + - selfoperatorid + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RegisterFederation + tags: + - Federation + /api/v1/auth/federation/self/zone/show: + post: + description: Show Federated Self Zones + operationId: ShowFederatedSelfZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatedSelfZone' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiFederatedSelfZone' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowFederatedSelfZone + tags: + - FederatorZone + /api/v1/auth/federation/show: + post: + description: Show Federation + operationId: ShowFederation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederation' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiFederation' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowFederation + tags: + - Federation + /api/v1/auth/federator/partner/zone/deregister: + post: + description: DeRegister Partner Federator Zone + operationId: DeRegisterPartnerFederatorZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatedZoneRegRequest' + x-required-fields: + - selfoperatorid + - federationname + - zones + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeRegisterPartnerFederatorZone + tags: + - FederatorZone + /api/v1/auth/federator/partner/zone/register: + post: + description: Register Partner Federator Zone + operationId: RegisterPartnerFederatorZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatedZoneRegRequest' + x-required-fields: + - selfoperatorid + - federationname + - zones + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RegisterPartnerFederatorZone + tags: + - FederatorZone + /api/v1/auth/federator/self/create: + post: + description: Create Self Federator + operationId: CreateSelfFederator + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederator' + x-required-fields: + - operatorid + - countrycode + - region + - mcc + - mnc + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederator' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateSelfFederator + tags: + - Federator + /api/v1/auth/federator/self/delete: + post: + description: Delete Self Federator + operationId: DeleteSelfFederator + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederator' + x-required-fields: + - operatorid + - federationid + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteSelfFederator + tags: + - Federator + /api/v1/auth/federator/self/generateapikey: + post: + description: Generate Self Federator API Key + operationId: GenerateSelfFederatorAPIKey + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederator' + x-required-fields: + - operatorid + - federationid + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederator' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GenerateSelfFederatorAPIKey + tags: + - Federator + /api/v1/auth/federator/self/show: + post: + description: Show Self Federator + operationId: ShowSelfFederator + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederator' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiFederator' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowSelfFederator + tags: + - Federator + /api/v1/auth/federator/self/update: + post: + description: Update Self Federator + operationId: UpdateSelfFederator + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederator' + x-required-fields: + - operatorid + - federationid + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateSelfFederator + tags: + - Federator + /api/v1/auth/federator/self/zone/create: + post: + description: Create Self Federator Zone + operationId: CreateSelfFederatorZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatorZone' + x-required-fields: + - zoneid + - operatorid + - countrycode + - cloudlets + - geolocation + - region + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateSelfFederatorZone + tags: + - FederatorZone + /api/v1/auth/federator/self/zone/delete: + post: + description: Delete Self Federator Zone + operationId: DeleteSelfFederatorZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatorZone' + x-required-fields: + - zoneid + - operatorid + - countrycode + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteSelfFederatorZone + tags: + - FederatorZone + /api/v1/auth/federator/self/zone/share: + post: + description: Share Self Federator Zone + operationId: ShareSelfFederatorZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatedSelfZone' + x-required-fields: + - zoneid + - selfoperatorid + - federationname + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShareSelfFederatorZone + tags: + - FederatorZone + /api/v1/auth/federator/self/zone/show: + post: + description: Show Self Federator Zone + operationId: ShowSelfFederatorZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatorZone' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiFederatorZone' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowSelfFederatorZone + tags: + - FederatorZone + /api/v1/auth/federator/self/zone/unshare: + post: + description: Unshare Self Federator Zone + operationId: UnshareSelfFederatorZone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiFederatedSelfZone' + x-required-fields: + - zoneid + - selfoperatorid + - federationname + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UnshareSelfFederatorZone + tags: + - FederatorZone + /api/v1/auth/gitlab/resync: + post: + description: Resync MC and Gitlab data + operationId: GitlabResync + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GitlabResync + tags: + - Repos + /api/v1/auth/metrics/app: + post: + description: View App metrics + operationId: ShowAppMetrics + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInstMetrics' + x-required-fields: + - region + - selector + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAppMetrics + tags: + - Metrics + /api/v1/auth/metrics/app/v2: + post: + description: View App metrics(v2 format) + operationId: ShowAppV2Metrics + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCustomAppMetrics' + x-required-fields: + - region + - measurement + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAppV2Metrics + tags: + - MetricsV2 + /api/v1/auth/metrics/clientapiusage: + post: + description: View client API usage + operationId: ShowClientApiUsageMetrics + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClientApiUsageMetrics' + x-required-fields: + - region + - selector + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowClientApiUsageMetrics + tags: + - Metrics + /api/v1/auth/metrics/clientappusage: + post: + description: View client App usage + operationId: ShowClientAppUsageMetrics + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClientAppUsageMetrics' + x-required-fields: + - region + - selector + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowClientAppUsageMetrics + tags: + - Metrics + /api/v1/auth/metrics/clientcloudletusage: + post: + description: View client Cloudlet usage + operationId: ShowClientCloudletUsageMetrics + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClientCloudletUsageMetrics' + x-required-fields: + - region + - cloudlet.organization + - selector + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowClientCloudletUsageMetrics + tags: + - Metrics + /api/v1/auth/metrics/cloudlet: + post: + description: View Cloudlet metrics + operationId: ShowCloudletMetrics + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletMetrics' + x-required-fields: + - region + - selector + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletMetrics + tags: + - Metrics + /api/v1/auth/metrics/cloudlet/usage: + post: + description: View Cloudlet usage + operationId: ShowCloudletUsage + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletMetrics' + x-required-fields: + - region + - selector + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletUsage + tags: + - Metrics + /api/v1/auth/metrics/cluster: + post: + description: View ClusterInst metrics + operationId: ShowClusterMetrics + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterInstMetrics' + x-required-fields: + - region + - selector + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowClusterMetrics + tags: + - Metrics + /api/v1/auth/org/create: + post: + description: Create a new developer or operator organization + operationId: CreateOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrganization' + x-required-fields: + - name + - type + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateOrg + tags: + - Org + /api/v1/auth/org/delete: + post: + description: Delete an organization + operationId: DeleteOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrganization' + x-required-fields: + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteOrg + tags: + - Org + /api/v1/auth/org/show: + post: + description: Show organizations + operationId: ShowOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrganization' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiOrganization' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowOrg + tags: + - Org + /api/v1/auth/org/update: + post: + description: Update an organization + operationId: UpdateOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrganization' + x-required-fields: + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateOrg + tags: + - Org + /api/v1/auth/orgcloudlet/show: + post: + description: "" + operationId: ShowOrgCloudlet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudlet' + x-required-fields: + - region + - org + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/EdgeprotoCloudlet' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowOrgCloudlet + tags: + - OrgCloudlet + /api/v1/auth/orgcloudletinfo/show: + post: + description: "" + operationId: ShowOrgCloudletInfo + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrgCloudlet' + x-required-fields: + - region + - org + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/EdgeprotoCloudletInfo' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowOrgCloudletInfo + tags: + - OrgCloudletInfo + /api/v1/auth/ratelimitsettingsmc/createflow: + post: + description: Create master controller flowratelimitsettings + operationId: CreateFlowRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitFlowSettings' + x-required-fields: + - flowsettingsname + - apiname + - ratelimittarget + - flowalgorithm + - reqspersecond + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateFlowRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/ratelimitsettingsmc/createmaxreqs: + post: + description: Create master controller maxreqsratelimitsettings + operationId: CreateMaxReqsRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitMaxReqsSettings' + x-required-fields: + - maxreqssettingsname + - apiname + - ratelimittarget + - maxreqsalgorithm + - maxrequests + - interval + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateMaxReqsRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/ratelimitsettingsmc/deleteflow: + post: + description: Delete master controller flowratelimitsettings + operationId: DeleteFlowRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitFlowSettings' + x-required-fields: + - flowsettingsname + - apiname + - ratelimittarget + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteFlowRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/ratelimitsettingsmc/deletemaxreqs: + post: + description: Delete master controller maxreqsratelimitsettings + operationId: DeleteMaxReqsRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitMaxReqsSettings' + x-required-fields: + - maxreqssettingsname + - apiname + - ratelimittarget + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteMaxReqsRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/ratelimitsettingsmc/show: + post: + description: Show master controller ratelimitsettings + operationId: ShowRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitSettings' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiMcRateLimitSettings' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/ratelimitsettingsmc/showflow: + post: + description: Show master controller flowratelimitsettings + operationId: ShowFlowRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitFlowSettings' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiMcRateLimitFlowSettings' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowFlowRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/ratelimitsettingsmc/showmaxreqs: + post: + description: Show master controller maxreqsratelimitsettings + operationId: ShowMaxReqsRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitMaxReqsSettings' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiMcRateLimitMaxReqsSettings' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowMaxReqsRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/ratelimitsettingsmc/updateflow: + post: + description: Update master controller flowratelimitsettings + operationId: UpdateFlowRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitFlowSettings' + x-required-fields: + - flowsettingsname + - apiname + - ratelimittarget + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateFlowRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/ratelimitsettingsmc/updatemaxreqs: + post: + description: Update master controller maxreqsratelimitsettings + operationId: UpdateMaxReqsRateLimitSettingsMc + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiMcRateLimitMaxReqsSettings' + x-required-fields: + - maxreqssettingsname + - apiname + - ratelimittarget + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateMaxReqsRateLimitSettingsMc + tags: + - RateLimitSettingsMc + /api/v1/auth/report/download: + post: + description: Download generated report + operationId: DownloadReport + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiDownloadReport' + x-required-fields: + - org + - filename + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DownloadReport + tags: + - Report + /api/v1/auth/report/generate: + post: + description: Generate new report for an org of all regions + operationId: GenerateReport + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiGenerateReport' + x-required-fields: + - org + - starttime + - endtime + responses: + "200": + content: + text/html;charset=UTF-8: + schema: + format: binary + type: string + description: pdf document + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GenerateReport + tags: + - Report + /api/v1/auth/report/generatedata: + post: + description: Generate report data for an org of all regions + operationId: GenerateReportData + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiGenerateReport' + x-required-fields: + - org + - starttime + - endtime + responses: + "200": + content: + application/json: + schema: + type: string + description: Generic mapped map[string]interface data + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: GenerateReportData + tags: + - ReportData + /api/v1/auth/report/show: + post: + description: Show already generated reports for an org + operationId: ShowReport + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiDownloadReport' + x-required-fields: + - org + responses: + "200": + content: + application/json: + schema: + items: + type: string + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowReport + tags: + - Report + /api/v1/auth/reporter/create: + post: + description: Create new reporter + operationId: CreateReporter + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiReporter' + x-required-fields: + - name + - org + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateReporter + tags: + - Reporter + /api/v1/auth/reporter/delete: + post: + description: Delete reporter + operationId: DeleteReporter + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiReporter' + x-required-fields: + - name + - org + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteReporter + tags: + - Reporter + /api/v1/auth/reporter/show: + post: + description: Show reporters + operationId: ShowReporter + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiReporter' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiReporter' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowReporter + tags: + - Reporter + /api/v1/auth/reporter/update: + post: + description: Update reporter + operationId: UpdateReporter + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiReporter' + x-required-fields: + - name + - org + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateReporter + tags: + - Reporter + /api/v1/auth/restricted/org/update: + post: + description: Admin-only update of org fields, requires name + operationId: RestrictedUpdateOrg + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiOrganization' + x-required-fields: + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RestrictedUpdateOrg + /api/v1/auth/restricted/user/update: + post: + description: Admin-only update of various user fields, requires name or email + operationId: RestrictedUpdateUser + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiUser' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RestrictedUpdateUser + /api/v1/auth/role/adduser: + post: + description: Add a role for the organization to the user + operationId: AddUserRole + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRole' + x-required-fields: + - org + - username + - role + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: AddUserRole + tags: + - Role + /api/v1/auth/role/assignment/show: + post: + description: Show roles for the current user + operationId: ShowRoleAssignment + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRole' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiRole' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowRoleAssignment + tags: + - Role + /api/v1/auth/role/perms/show: + post: + description: Show permissions associated with each role + operationId: ShowRolePerm + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRolePerm' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiRolePerm' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowRolePerm + tags: + - Role + /api/v1/auth/role/removeuser: + post: + description: Remove the role for the organization from the user + operationId: RemoveUserRole + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRole' + x-required-fields: + - org + - username + - role + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: RemoveUserRole + tags: + - Role + /api/v1/auth/role/show: + post: + description: Show role names + operationId: ShowRoleNames + responses: + "200": + content: + application/json: + schema: + items: + type: string + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowRoleNames + tags: + - Role + /api/v1/auth/role/showuser: + post: + description: Show roles for the organizations the current user can add or remove + roles to + operationId: ShowUserRole + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRole' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiRole' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowUserRole + tags: + - Role + /api/v1/auth/spans/show: + post: + description: Search spans + operationId: ShowSpans + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/NodeSpanSearch' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/NodeSpanOutCondensed' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowSpans + tags: + - Spans + /api/v1/auth/spans/showverbose: + post: + description: Search spans, output raw format + operationId: ShowSpansVerbose + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/NodeSpanSearch' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/DbmodelSpan' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowSpansVerbose + tags: + - Spans + /api/v1/auth/spans/terms: + post: + description: Show aggregated spans terms + operationId: SpanTerms + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/NodeSpanSearch' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/NodeSpanTerms' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: SpanTerms + tags: + - Spans + /api/v1/auth/usage/app: + post: + description: View App usage + operationId: ShowAppUsage + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionAppInstUsage' + x-required-fields: + - region + - starttime + - endtime + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowAppUsage + tags: + - Usage + /api/v1/auth/usage/cloudletpool: + post: + description: View CloudletPool usage + operationId: ShowCloudletPoolUsage + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionCloudletPoolUsage' + x-required-fields: + - region + - cloudletpool.name + - cloudletpool.organization + - starttime + - endtime + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowCloudletPoolUsage + tags: + - Usage + /api/v1/auth/usage/cluster: + post: + description: View ClusterInst usage + operationId: ShowClusterUsage + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiRegionClusterInstUsage' + x-required-fields: + - region + - starttime + - endtime + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiAllMetrics' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowClusterUsage + tags: + - Usage + /api/v1/auth/user/create/apikey: + post: + description: Create an API key for reduced access, typically for automation + operationId: CreateUserApiKey + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiCreateUserApiKey' + x-required-fields: + - userapikey.org + - userapikey.description + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiCreateUserApiKey' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CreateUserApiKey + tags: + - User + /api/v1/auth/user/current: + post: + description: Show the currently logged in user + operationId: CurrentUser + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiUser' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: CurrentUser + tags: + - User + /api/v1/auth/user/delete: + post: + description: Delete an existing user + operationId: DeleteUser + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiUser' + x-required-fields: + - name + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteUser + tags: + - User + /api/v1/auth/user/delete/apikey: + post: + description: Delete an API key + operationId: DeleteUserApiKey + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiCreateUserApiKey' + x-required-fields: + - userapikey.id + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: DeleteUserApiKey + tags: + - User + /api/v1/auth/user/newpass: + post: + description: Set a new password while logged in, requires the existing password + operationId: NewPassword + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiNewPassword' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: NewPassword + tags: + - User + /api/v1/auth/user/show: + post: + description: Show users + operationId: ShowUser + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiShowUser' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiUser' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowUser + tags: + - User + /api/v1/auth/user/show/apikey: + post: + description: Show existing API keys + operationId: ShowUserApiKey + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiCreateUserApiKey' + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrmapiCreateUserApiKey' + type: array + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: ShowUserApiKey + tags: + - User + /api/v1/auth/user/update: + post: + description: Update a user + operationId: UpdateUser + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiCreateUser' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiUserResponse' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + "403": + description: Forbidden + security: + - bearerAuth: [] + summary: UpdateUser + tags: + - User + /api/v1/login: + post: + description: Login using account credentials + operationId: Login + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiUserLogin' + responses: + "200": + content: + application/json: + schema: + type: string + description: Map with key "token" whose value is the JWT key to be used + in subsequent API calls, and "admin" to indicate if the user is an admin + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + summary: Login + /api/v1/passwordreset: + post: + description: Reset the password using the token from the password reset email + operationId: PasswordReset + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiPasswordReset' + x-required-fields: + - token + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + summary: PasswordReset + tags: + - User + /api/v1/passwordresetrequest: + post: + description: Request a password reset email to be sent to the user's email + operationId: PasswordResetRequest + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiEmailRequest' + x-required-fields: + - email + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + summary: PasswordResetRequest + tags: + - User + /api/v1/publicconfig: + post: + description: Show publicly visible master controller global configuration + operationId: ShowPublicConfig + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiConfig' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + summary: ShowPublicConfig + tags: + - Config + /api/v1/resendverify: + post: + description: Request that the user verification email be resent + operationId: ResendVerify + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiEmailRequest' + x-required-fields: + - email + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + summary: ResendVerify + tags: + - User + /api/v1/usercreate: + post: + description: Create a new user + operationId: CreateUser + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiCreateUser' + x-required-fields: + - user.name + - user.email + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiUserResponse' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + summary: CreateUser + tags: + - User + /api/v1/verifyemail: + post: + description: Verify a user's email account from the token in the email + operationId: VerifyEmail + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiToken' + x-required-fields: + - token + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/OrmapiResult' + description: Bad Request + summary: VerifyEmail + tags: + - User +components: + schemas: + BillingAddress: + properties: + city: + type: string + country: + type: string + line2: + type: string + state: + type: string + street: + type: string + zip: + type: string + type: object + BillingCredits: + properties: + applied_amount: + type: string + credit_note_number: + type: string + credit_note_uid: + type: string + memo: + type: string + original_amount: + type: string + transaction_time: + type: string + uid: + type: string + type: object + BillingDiscounts: + properties: + code: + type: string + discount_amount: + type: string + discount_type: + type: string + eligible_amount: + type: string + line_items_breakouts: + items: + $ref: '#/components/schemas/BillingLineItemsBreakouts' + type: array + percentage: + type: string + source_id: + type: integer + source_type: + type: string + title: + type: string + uid: + type: string + type: object + BillingInvoiceData: + properties: + billing_address: + $ref: '#/components/schemas/BillingAddress' + collection_method: + type: string + consolidation_level: + type: string + credit_amount: + type: string + credits: + items: + $ref: '#/components/schemas/BillingCredits' + type: array + currency: + description: ISO 4217 currency code + type: string + customer: + properties: + email: + type: string + first_name: + type: string + last_name: + type: string + organization: + type: string + type: object + discount_amount: + type: string + discounts: + items: + $ref: '#/components/schemas/BillingDiscounts' + type: array + due_amount: + description: Amount due, which is total - credit - paid + type: string + due_date: + description: Date the invoice is due. + type: string + issue_date: + description: Date the invoice was issued to the customer + type: string + line_items: + items: + $ref: '#/components/schemas/BillingLineItems' + type: array + memo: + type: string + number: + description: A unique string that identifies the invoice + type: string + paid_amount: + description: Paid amount + type: string + paid_date: + description: Date the invoice was fully paid + type: string + payment_instructions: + type: string + payments: + items: + $ref: '#/components/schemas/BillingPayments' + type: array + previous_balance_data: + $ref: '#/components/schemas/BillingPrevBalanceData' + product_name: + type: string + refund_amount: + type: string + refunds: + items: + $ref: '#/components/schemas/BillingRefunds' + type: array + seller: + properties: + address: + $ref: '#/components/schemas/BillingAddress' + name: + type: string + phone: + type: string + type: object + shipping_address: + $ref: '#/components/schemas/BillingAddress' + status: + type: string + subtotal_amount: + description: Subtotal of invoice, sum of all line items before discounts + or taxes + type: string + tax_amount: + type: string + taxes: + items: + $ref: '#/components/schemas/BillingTaxes' + type: array + total_amount: + description: Total amount, which subtotal - discount + tax + type: string + type: object + BillingLineItems: + properties: + component_id: + type: integer + description: + type: string + discount_amount: + type: string + period_range_end: + type: string + period_range_start: + type: string + price_point_id: + type: integer + product_id: + type: integer + product_price_point_id: + type: integer + product_version: + type: integer + quantity: + type: string + subtotal_amount: + type: string + tax_amount: + type: string + tiered_unit_price: + type: boolean + title: + type: string + total_amount: + type: string + uid: + type: string + unit_price: + type: string + type: object + BillingLineItemsBreakouts: + properties: + discount_amount: + type: string + eligible_amount: + type: string + uid: + type: string + type: object + BillingPaymentProfile: + properties: + card_number: + type: string + card_type: + type: string + profile_id: + type: integer + type: object + BillingPayments: + properties: + applied_amount: + type: string + gateway_transaction_id: + type: string + memo: + description: Memo noted on the payment + type: string + original_amount: + type: string + payment_method: + items: + properties: + card_brand: + type: string + card_expiration: + type: string + details: + type: string + kind: + type: string + last_four: + type: string + masked_card_number: + type: string + memo: + description: Memo noted on the payment + type: string + type: + type: string + type: object + type: array + prepayment: + type: boolean + transaction_id: + type: integer + transaction_time: + type: string + type: object + BillingPrevBalanceData: + properties: + capture_date: + type: string + invoices: + items: + properties: + number: + type: string + outstanding_amount: + type: string + uid: + type: string + type: object + type: array + type: object + BillingRefunds: + properties: + applied_amount: + type: string + gateway_transaction_id: + description: Transaction ID for the refund as returned from the payment + gateway + type: string + memo: + description: Memo noted on refund + type: string + original_amount: + type: string + payment_id: + description: Payment ID to be refunded + type: integer + transaction_id: + type: integer + type: object + BillingTaxes: + properties: + line_items_breakouts: + items: + $ref: '#/components/schemas/BillingLineItemsBreakouts' + type: array + percentage: + type: string + source_id: + type: integer + source_type: + type: string + tax_amount: + type: string + taxable_amount: + type: string + title: + type: string + uid: + type: string + type: object + DbmodelKeyValue: + properties: + key: + type: string + type: + $ref: '#/components/schemas/DbmodelValueType' + value: {} + type: object + DbmodelLog: + properties: + fields: + items: + $ref: '#/components/schemas/DbmodelKeyValue' + nullable: true + type: array + timestamp: + minimum: 0 + type: integer + type: object + DbmodelProcess: + properties: + serviceName: + type: string + tag: + additionalProperties: {} + type: object + tags: + items: + $ref: '#/components/schemas/DbmodelKeyValue' + nullable: true + type: array + type: object + DbmodelReference: + properties: + refType: + $ref: '#/components/schemas/DbmodelReferenceType' + spanID: + $ref: '#/components/schemas/DbmodelSpanID' + traceID: + $ref: '#/components/schemas/DbmodelTraceID' + type: object + DbmodelReferenceType: + type: string + DbmodelSpan: + properties: + duration: + minimum: 0 + type: integer + flags: + minimum: 0 + type: integer + logs: + items: + $ref: '#/components/schemas/DbmodelLog' + nullable: true + type: array + operationName: + type: string + parentSpanID: + $ref: '#/components/schemas/DbmodelSpanID' + process: + $ref: '#/components/schemas/DbmodelProcess' + references: + items: + $ref: '#/components/schemas/DbmodelReference' + nullable: true + type: array + spanID: + $ref: '#/components/schemas/DbmodelSpanID' + startTime: + minimum: 0 + type: integer + startTimeMillis: + minimum: 0 + type: integer + tag: + additionalProperties: {} + type: object + tags: + items: + $ref: '#/components/schemas/DbmodelKeyValue' + nullable: true + type: array + traceID: + $ref: '#/components/schemas/DbmodelTraceID' + type: object + DbmodelSpanID: + type: string + DbmodelTraceID: + type: string + DbmodelValueType: + type: string + DmeProtoAppPort: + properties: + end_port: + description: A non-zero end port indicates a port range from internal port + to end port, inclusive. + type: integer + fqdn_prefix: + description: FQDN prefix to append to base FQDN in FindCloudlet response. + May be empty. + type: string + internal_port: + description: Container port + type: integer + max_pkt_size: + description: Maximum datagram size (udp only) + type: integer + nginx: + description: Use nginx proxy for this port if you really need a transparent + proxy (udp only) + type: boolean + proto: + $ref: '#/components/schemas/DmeProtoLProto' + public_port: + description: Public facing port for TCP/UDP (may be mapped on shared LB + reverse proxy) + type: integer + tls: + description: TLS termination for this port + type: boolean + type: object + DmeProtoCloudletState: + type: integer + DmeProtoHealthCheck: + type: integer + DmeProtoLProto: + type: integer + DmeProtoLoc: + properties: + altitude: + description: On android only lat and long are guaranteed to be supplied + Altitude in meters + type: number + course: + description: Course (IOS) / bearing (Android) (degrees east relative to + true north) + type: number + horizontal_accuracy: + description: Horizontal accuracy (radius in meters) + type: number + latitude: + description: Latitude in WGS 84 coordinates + type: number + longitude: + description: Longitude in WGS 84 coordinates + type: number + speed: + description: Speed (IOS) / velocity (Android) (meters/sec) + type: number + timestamp: + $ref: '#/components/schemas/DmeProtoTimestamp' + vertical_accuracy: + description: Vertical accuracy (meters) + type: number + type: object + DmeProtoMaintenanceState: + type: integer + DmeProtoTimestamp: + properties: + nanos: + description: Added non-negative sub-second time in nanoseconds + type: integer + seconds: + description: Time in seconds since epoch + type: integer + type: object + EdgeprotoAlert: + properties: + active_at: + description: When alert became active + type: string + annotations: + additionalProperties: + type: string + description: Annotations are extra information about the alert + type: object + controller: + description: Connected controller unique id + type: string + labels: + additionalProperties: + type: string + description: Labels uniquely define the alert + type: object + notify_id: + description: Id of client assigned by server (internal use only) + type: integer + state: + description: State of the alert + type: string + value: + description: Any value associated with alert + type: number + type: object + EdgeprotoAlertPolicy: + properties: + active_conn_limit: + description: Active Connections alert threshold. Valid values 1-4294967295 + minimum: 0 + type: integer + annotations: + additionalProperties: + type: string + description: Additional Annotations for extra information about the alert + type: object + cpu_utilization_limit: + description: Container or pod CPU utilization rate(percentage) across all + nodes. Valid values 1-100 + minimum: 0 + type: integer + delete_prepare: + description: Preparing to be deleted + type: boolean + description: + description: Description of the alert policy + type: string + disk_utilization_limit: + description: Container or pod disk utilization rate(percentage) across all + nodes. Valid values 1-100 + minimum: 0 + type: integer + key: + $ref: '#/components/schemas/EdgeprotoAlertPolicyKey' + labels: + additionalProperties: + type: string + description: Additional Labels + type: object + mem_utilization_limit: + description: Container or pod memory utilization rate(percentage) across + all nodes. Valid values 1-100 + minimum: 0 + type: integer + severity: + description: Alert severity level - one of "info", "warning", "error" + type: string + trigger_time: + description: Duration for which alert interval is active (max 72 hours) + type: string + type: object + EdgeprotoAlertPolicyKey: + properties: + name: + description: Alert Policy name + type: string + organization: + description: Name of the organization for the app that this alert can be + applied to + type: string + type: object + EdgeprotoApp: + properties: + access_ports: + description: 'Comma separated list of protocol:port pairs that the App listens + on. Ex: "tcp:80,udp:10002". Also supports additional configurations per + port: (1) tls (tcp-only) - Enables TLS on specified port. Ex: "tcp:443:tls". + (2) nginx (udp-only) - Use NGINX LB instead of envoy for specified port. + Ex: "udp:10001:nginx". (3) maxpktsize (udp-only) - Configures maximum + UDP datagram size allowed on port for both upstream/downstream traffic. + Ex: "udp:10001:maxpktsize=8000".' + type: string + access_type: + description: (_deprecated_) Access type, valid values are one of DefaultForDeployment, + Direct, LoadBalancer, or 0, 1, 2 + type: string + alert_policies: + description: Alert Policies + items: + type: string + type: array + allow_serverless: + description: App is allowed to deploy as serverless containers + type: boolean + android_package_name: + description: Android package name used to match the App name from the Android + package + type: string + annotations: + description: 'Annotations is a comma separated map of arbitrary key value + pairs, for example: key1=val1,key2=val2,key3="val 3"' + type: string + auth_public_key: + description: Public key used for authentication + type: string + auto_prov_policies: + description: Auto provisioning policy names, may be specified multiple times + items: + type: string + type: array + auto_prov_policy: + description: (_deprecated_) Auto provisioning policy name + type: string + command: + description: Command that the container runs to start service + type: string + configs: + description: Customization files passed through to implementing services + items: + $ref: '#/components/schemas/EdgeprotoConfigFile' + type: array + created_at: + description: Created at time + type: string + default_flavor: + $ref: '#/components/schemas/EdgeprotoFlavorKey' + del_opt: + description: Override actions to Controller, valid values are one of NoAutoDelete, + AutoDelete, or 0, 1 + type: string + delete_prepare: + description: Preparing to be deleted + type: boolean + deployment: + description: Deployment type (kubernetes, docker, or vm) + type: string + deployment_generator: + description: Deployment generator target to generate a basic deployment + manifest + type: string + deployment_manifest: + description: Deployment manifest is the deployment specific manifest file/config. + For docker deployment, this can be a docker-compose or docker run file. + For kubernetes deployment, this can be a kubernetes yaml or helm chart + file. + type: string + image_path: + description: URI of where image resides + type: string + image_type: + description: Image type, valid values are one of Unknown, Docker, Qcow, + Helm, Ovf, or 0, 1, 2, 3, 4 + type: string + internal_ports: + description: Set true to indicate App is used internally with other Apps + only, and no ports are exposed externally + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoAppKey' + md5sum: + description: MD5Sum of the VM-based app image + type: string + official_fqdn: + description: Official FQDN is the FQDN that the app uses to connect by default + type: string + qos_session_duration: + description: Session duration in seconds. Maximal value of 24 hours is used + if not set + type: string + qos_session_profile: + description: Qualifier for the requested latency profile, valid values are + one of NoPriority, LowLatency, ThroughputDownS, ThroughputDownM, ThroughputDownL, + or 0, 1, 2, 3, 4 + type: string + required_outbound_connections: + description: Connections this app require to determine if the app is compatible + with a trust policy + items: + $ref: '#/components/schemas/EdgeprotoSecurityRule' + nullable: true + type: array + revision: + description: Revision can be specified or defaults to current timestamp + when app is updated + type: string + scale_with_cluster: + description: Set true to run App on all nodes of the cluster + type: boolean + serverless_config: + $ref: '#/components/schemas/EdgeprotoServerlessConfig' + skip_hc_ports: + description: Comma separated list of protocol:port pairs that we should + not run health check on. Should be configured in case app does not always + listen on these ports. "all" can be specified if no health check to be + run for this app. Numerical values must be decimal format. i.e. tcp:80,udp:10002 + type: string + template_delimiter: + description: Delimiter to be used for template parsing, defaults to "[[ + ]]" + type: string + trusted: + description: Indicates that an instance of this app can be started on a + trusted cloudlet + type: boolean + updated_at: + description: Updated at time + type: string + vm_app_os_type: + description: OS Type for VM Apps, valid values are one of Unknown, Linux, + Windows10, Windows2012, Windows2016, Windows2019, or 0, 1, 2, 3, 4, 5 + type: string + type: object + EdgeprotoAppAlertPolicy: + properties: + alert_policy: + description: Alert name + type: string + app_key: + $ref: '#/components/schemas/EdgeprotoAppKey' + type: object + EdgeprotoAppAutoProvPolicy: + properties: + app_key: + $ref: '#/components/schemas/EdgeprotoAppKey' + auto_prov_policy: + description: Auto provisioning policy name + type: string + type: object + EdgeprotoAppInst: + properties: + auto_cluster_ip_access: + description: (Deprecated) IpAccess for auto-clusters. Ignored otherwise., + valid values are one of Unknown, Dedicated, Shared, or 0, 1, 3 + type: string + availability_zone: + description: Optional Availability Zone if any + type: string + cloudlet_loc: + $ref: '#/components/schemas/DmeProtoLoc' + configs: + description: Customization files passed through to implementing services + items: + $ref: '#/components/schemas/EdgeprotoConfigFile' + type: array + created_at: + description: Created at time + type: string + crm_override: + description: Override actions to CRM, valid values are one of NoOverride, + IgnoreCrmErrors, IgnoreCrm, IgnoreTransientState, IgnoreCrmAndTransientState, + or 0, 1, 2, 3, 4 + type: string + dedicated_ip: + description: Dedicated IP assigns an IP for this AppInst but requires platform + support + type: boolean + dns_label: + description: DNS label that is unique within the cloudlet and among other + AppInsts/ClusterInsts + type: string + errors: + description: Any errors trying to create, update, or delete the AppInst + on the Cloudlet + items: + type: string + type: array + external_volume_size: + description: Size of external volume to be attached to nodes. This is for + the root partition + minimum: 0 + type: integer + flavor: + $ref: '#/components/schemas/EdgeprotoFlavorKey' + force_update: + description: Force Appinst refresh even if revision number matches App revision + number. + type: boolean + health_check: + $ref: '#/components/schemas/DmeProtoHealthCheck' + internal_port_to_lb_ip: + additionalProperties: + type: string + description: mapping of ports to load balancer IPs + type: object + key: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + liveness: + description: Liveness of instance (see Liveness), valid values are one of + Unknown, Static, Dynamic, Autoprov, or 0, 1, 2, 3 + type: string + mapped_ports: + description: For instances accessible via a shared load balancer, defines + the external ports on the shared load balancer that map to the internal + ports External ports should be appended to the Uri for L4 access. + items: + $ref: '#/components/schemas/DmeProtoAppPort' + nullable: true + type: array + opt_res: + description: Optional Resources required by OS flavor if any + type: string + power_state: + description: Power State of the AppInst, valid values are one of PowerStateUnknown, + PowerOnRequested, PoweringOn, PowerOn, PowerOffRequested, PoweringOff, + PowerOff, RebootRequested, Rebooting, Reboot, PowerStateError, or 0, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10 + type: string + real_cluster_name: + description: Real ClusterInst name + type: string + revision: + description: Revision changes each time the App is updated. Refreshing + the App Instance will sync the revision with that of the App + type: string + runtime_info: + $ref: '#/components/schemas/EdgeprotoAppInstRuntime' + state: + description: Current state of the AppInst on the Cloudlet, valid values + are one of TrackedStateUnknown, NotPresent, CreateRequested, Creating, + CreateError, Ready, UpdateRequested, Updating, UpdateError, DeleteRequested, + Deleting, DeleteError, DeletePrepare, CrmInitok, CreatingDependencies, + DeleteDone, or 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + type: string + unique_id: + description: A unique id for the AppInst within the region to be used by + platforms + type: string + update_multiple: + description: Allow multiple instances to be updated at once + type: boolean + updated_at: + description: Updated at time + type: string + uri: + description: Base FQDN (not really URI) for the App. See Service FQDN for + endpoint access. + type: string + vm_flavor: + description: OS node flavor to use + type: string + type: object + EdgeprotoAppInstClient: + properties: + client_key: + $ref: '#/components/schemas/EdgeprotoAppInstClientKey' + location: + $ref: '#/components/schemas/DmeProtoLoc' + notify_id: + description: Id of client assigned by server (internal use only) + type: integer + type: object + EdgeprotoAppInstClientKey: + properties: + app_inst_key: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + unique_id: + description: AppInstClient Unique Id + type: string + unique_id_type: + description: AppInstClient Unique Id Type + type: string + type: object + EdgeprotoAppInstKey: + properties: + app_key: + $ref: '#/components/schemas/EdgeprotoAppKey' + cluster_inst_key: + $ref: '#/components/schemas/EdgeprotoVirtualClusterInstKey' + type: object + EdgeprotoAppInstLatency: + properties: + key: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + type: object + EdgeprotoAppInstRefKey: + properties: + app_key: + $ref: '#/components/schemas/EdgeprotoAppKey' + cluster_inst_key: + $ref: '#/components/schemas/EdgeprotoClusterInstRefKey' + type: object + EdgeprotoAppInstRefs: + properties: + delete_requested_insts: + additionalProperties: + minimum: 0 + type: integer + description: AppInsts being deleted (key is JSON of AppInst Key) + nullable: true + type: object + insts: + additionalProperties: + minimum: 0 + type: integer + description: AppInsts for App (key is JSON of AppInst Key) + nullable: true + type: object + key: + $ref: '#/components/schemas/EdgeprotoAppKey' + type: object + EdgeprotoAppInstRuntime: + properties: + container_ids: + description: List of container names + items: + type: string + type: array + type: object + EdgeprotoAppKey: + properties: + name: + description: App name + type: string + organization: + description: App developer organization + type: string + version: + description: App version + type: string + type: object + EdgeprotoAutoProvCloudlet: + properties: + key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + loc: + $ref: '#/components/schemas/DmeProtoLoc' + type: object + EdgeprotoAutoProvPolicy: + properties: + cloudlets: + description: Allowed deployment locations + items: + $ref: '#/components/schemas/EdgeprotoAutoProvCloudlet' + type: array + delete_prepare: + description: Preparing to be deleted + type: boolean + deploy_client_count: + description: Minimum number of clients within the auto deploy interval to + trigger deployment + minimum: 0 + type: integer + deploy_interval_count: + description: Number of intervals to check before triggering deployment + minimum: 0 + type: integer + key: + $ref: '#/components/schemas/EdgeprotoPolicyKey' + max_instances: + description: Maximum number of instances (active or not) + minimum: 0 + type: integer + min_active_instances: + description: Minimum number of active instances for High-Availability + minimum: 0 + type: integer + undeploy_client_count: + description: Number of active clients for the undeploy interval below which + trigers undeployment, 0 (default) disables auto undeploy + minimum: 0 + type: integer + undeploy_interval_count: + description: Number of intervals to check before triggering undeployment + minimum: 0 + type: integer + type: object + EdgeprotoAutoProvPolicyCloudlet: + properties: + cloudlet_key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + key: + $ref: '#/components/schemas/EdgeprotoPolicyKey' + type: object + EdgeprotoAutoScalePolicy: + properties: + delete_prepare: + description: Preparing to be deleted + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoPolicyKey' + max_nodes: + description: Maximum number of cluster nodes + minimum: 0 + type: integer + min_nodes: + description: Minimum number of cluster nodes + minimum: 0 + type: integer + scale_down_cpu_thresh: + description: (Deprecated) Scale down cpu threshold (percentage 1 to 100), + 0 means disabled + minimum: 0 + type: integer + scale_up_cpu_thresh: + description: (Deprecated) Scale up cpu threshold (percentage 1 to 100), + 0 means disabled + minimum: 0 + type: integer + stabilization_window_sec: + description: Stabilization window is the time for which past triggers are + considered; the largest scale factor is always taken. + minimum: 0 + type: integer + target_active_connections: + description: Target per-node number of active connections, 0 means disabled + minimum: 0 + type: integer + target_cpu: + description: Target per-node cpu utilization (percentage 1 to 100), 0 means + disabled + minimum: 0 + type: integer + target_mem: + description: Target per-node memory utilization (percentage 1 to 100), 0 + means disabled + minimum: 0 + type: integer + trigger_time_sec: + description: (Deprecated) Trigger time defines how long the target must + be satified in seconds before acting upon it. + minimum: 0 + type: integer + type: object + EdgeprotoCloudlet: + properties: + HostController: + description: Address of the controller hosting the cloudlet services if + it is running locally + type: string + access_vars: + additionalProperties: + type: string + description: Variables required to access cloudlet + type: object + alliance_orgs: + description: This cloudlet will be treated as directly connected to these + additional operator organizations for the purposes of FindCloudlet + items: + type: string + type: array + chef_client_key: + additionalProperties: + type: string + description: Chef client key + type: object + config: + $ref: '#/components/schemas/EdgeprotoPlatformConfig' + container_version: + description: Cloudlet container version + type: string + created_at: + description: Created at time + type: string + crm_access_key_upgrade_required: + description: CRM access key upgrade required + type: boolean + crm_access_public_key: + description: CRM access public key + type: string + crm_override: + description: Override actions to CRM, valid values are one of NoOverride, + IgnoreCrmErrors, IgnoreCrm, IgnoreTransientState, IgnoreCrmAndTransientState, + or 0, 1, 2, 3, 4 + type: string + default_resource_alert_threshold: + description: Default resource alert threshold percentage + type: integer + delete_prepare: + description: Preparing to be deleted + type: boolean + deployment: + description: Deployment type to bring up CRM services (docker, kubernetes) + type: string + deployment_local: + description: Deploy cloudlet services locally + type: boolean + dns_label: + description: DNS label that is unique within the region + type: string + enable_default_serverless_cluster: + description: Enable experimental default multitenant (serverless) cluster + type: boolean + env_var: + additionalProperties: + type: string + description: Single Key-Value pair of env var to be passed to CRM + type: object + errors: + description: Any errors trying to create, update, or delete the Cloudlet. + items: + type: string + type: array + federation_config: + $ref: '#/components/schemas/EdgeprotoFederationConfig' + fields: + description: Fields are used for the Update API to specify which fields + to apply + items: + type: string + type: array + flavor: + $ref: '#/components/schemas/EdgeprotoFlavorKey' + gpu_config: + $ref: '#/components/schemas/EdgeprotoGPUConfig' + infra_api_access: + description: Infra Access Type is the type of access available to Infra + API Endpoint, valid values are one of DirectAccess, RestrictedAccess, + or 0, 1 + type: string + infra_config: + $ref: '#/components/schemas/EdgeprotoInfraConfig' + ip_support: + description: Type of IP support provided by Cloudlet (see IpSupport), valid + values are one of Unknown, Static, Dynamic, or 0, 1, 2 + type: string + kafka_cluster: + description: Operator provided kafka cluster endpoint to push events to + type: string + kafka_password: + description: Password for kafka SASL/PLAIN authentification, stored securely + in secret storage and never visible externally + type: string + kafka_user: + description: Username for kafka SASL/PLAIN authentification, stored securely + in secret storage and never visible externally + type: string + key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + license_config_storage_path: + description: GPU driver license config storage path + type: string + location: + $ref: '#/components/schemas/DmeProtoLoc' + maintenance_state: + $ref: '#/components/schemas/DmeProtoMaintenanceState' + notify_srv_addr: + description: Address for the CRM notify listener to run on + type: string + num_dynamic_ips: + description: Number of dynamic IPs available for dynamic IP support + type: integer + override_policy_container_version: + description: Override container version from policy file + type: boolean + physical_name: + description: Physical infrastructure cloudlet name + type: string + platform_high_availability: + description: Enable platform H/A + type: boolean + platform_type: + description: Platform type, valid values are one of Fake, Dind, Openstack, + Azure, Gcp, Edgebox, Fakeinfra, Vsphere, AwsEks, VmPool, AwsEc2, Vcd, + K8SBareMetal, Kind, Kindinfra, FakeSingleCluster, Federation, FakeVmPool, + or 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 + type: string + res_tag_map: + additionalProperties: + $ref: '#/components/schemas/EdgeprotoResTagTableKey' + description: Optional resource to restagtbl key map key values = [gpu, nas, + nic] + type: object + resource_quotas: + description: Resource quotas + items: + $ref: '#/components/schemas/EdgeprotoResourceQuota' + nullable: true + type: array + root_lb_fqdn: + description: Root LB FQDN which is globally unique + type: string + secondary_crm_access_key_upgrade_required: + description: CRM secondary access key upgrade required for H/A + type: boolean + secondary_crm_access_public_key: + description: CRM secondary access public key for H/A + type: string + secondary_notify_srv_addr: + description: Address for the secondary CRM notify listener to run on + type: string + single_kubernetes_cluster_owner: + description: For single kubernetes cluster cloudlet platforms, cluster is + owned by this organization instead of multi-tenant + type: string + state: + description: Current state of the cloudlet, valid values are one of TrackedStateUnknown, + NotPresent, CreateRequested, Creating, CreateError, Ready, UpdateRequested, + Updating, UpdateError, DeleteRequested, Deleting, DeleteError, DeletePrepare, + CrmInitok, CreatingDependencies, DeleteDone, or 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15 + type: string + static_ips: + description: List of static IPs for static IP support + type: string + time_limits: + $ref: '#/components/schemas/EdgeprotoOperationTimeLimits' + trust_policy: + description: Optional Trust Policy + type: string + trust_policy_state: + description: State of trust policy, valid values are one of TrackedStateUnknown, + NotPresent, CreateRequested, Creating, CreateError, Ready, UpdateRequested, + Updating, UpdateError, DeleteRequested, Deleting, DeleteError, DeletePrepare, + CrmInitok, CreatingDependencies, DeleteDone, or 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15 + type: string + updated_at: + description: Updated at time + type: string + vm_image_version: + description: EdgeCloud baseimage version where CRM services reside + type: string + vm_pool: + description: VM Pool + type: string + type: object + EdgeprotoCloudletAllianceOrg: + properties: + key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + organization: + description: Alliance organization + type: string + type: object + EdgeprotoCloudletInfo: + properties: + active_crm_instance: + description: Active HA instance + type: string + availability_zones: + description: Availability Zones if any + items: + $ref: '#/components/schemas/EdgeprotoOSAZone' + type: array + compatibility_version: + description: Version for compatibility tracking + minimum: 0 + type: integer + container_version: + description: Cloudlet container version + type: string + controller: + description: Connected controller unique id + type: string + controller_cache_received: + description: Indicates all controller data has been sent to CRM + type: boolean + errors: + description: Any errors encountered while making changes to the Cloudlet + items: + type: string + type: array + flavors: + description: Supported flavors by the Cloudlet + items: + $ref: '#/components/schemas/EdgeprotoFlavorInfo' + type: array + key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + maintenance_state: + $ref: '#/components/schemas/DmeProtoMaintenanceState' + node_infos: + description: Cluster node info for serverless platforms (k8s multi-tenant + cluster) + items: + $ref: '#/components/schemas/EdgeprotoNodeInfo' + type: array + notify_id: + description: Id of client assigned by server (internal use only) + type: integer + os_images: + description: Local Images availble to cloudlet + items: + $ref: '#/components/schemas/EdgeprotoOSImage' + type: array + os_max_ram: + description: Maximum Ram in MB on the Cloudlet + minimum: 0 + type: integer + os_max_vcores: + description: Maximum number of VCPU cores on the Cloudlet + minimum: 0 + type: integer + os_max_vol_gb: + description: Maximum amount of disk in GB on the Cloudlet + minimum: 0 + type: integer + properties: + additionalProperties: + type: string + description: Cloudlet properties + type: object + release_version: + description: Cloudlet release version + type: string + resources_snapshot: + $ref: '#/components/schemas/EdgeprotoInfraResourcesSnapshot' + standby_crm: + description: Denotes if info was reported by inactive + type: boolean + state: + $ref: '#/components/schemas/DmeProtoCloudletState' + trust_policy_state: + description: Trust Policy State, valid values are one of TrackedStateUnknown, + NotPresent, CreateRequested, Creating, CreateError, Ready, UpdateRequested, + Updating, UpdateError, DeleteRequested, Deleting, DeleteError, DeletePrepare, + CrmInitok, CreatingDependencies, DeleteDone, or 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15 + type: string + type: object + EdgeprotoCloudletKey: + properties: + federated_organization: + description: Federated operator organization who shared this cloudlet + type: string + name: + description: Name of the cloudlet + type: string + organization: + description: Organization of the cloudlet site + type: string + type: object + EdgeprotoCloudletManifest: + properties: + manifest: + description: Manifest to bringup cloudlet VM and services. + type: string + type: object + EdgeprotoCloudletMgmtNode: + properties: + name: + description: Name of Cloudlet Mgmt Node + type: string + type: + description: Type of Cloudlet Mgmt Node + type: string + type: object + EdgeprotoCloudletPool: + properties: + cloudlets: + description: Cloudlets part of the pool + items: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + nullable: true + type: array + created_at: + description: Created at time + type: string + delete_prepare: + description: Preparing to be deleted + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoCloudletPoolKey' + updated_at: + description: Updated at time + type: string + type: object + EdgeprotoCloudletPoolKey: + properties: + name: + description: CloudletPool Name + type: string + organization: + description: Name of the organization this pool belongs to + type: string + type: object + EdgeprotoCloudletPoolMember: + properties: + cloudlet: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + key: + $ref: '#/components/schemas/EdgeprotoCloudletPoolKey' + type: object + EdgeprotoCloudletProps: + properties: + organization: + description: Organization + type: string + platform_type: + description: Platform type, valid values are one of Fake, Dind, Openstack, + Azure, Gcp, Edgebox, Fakeinfra, Vsphere, AwsEks, VmPool, AwsEc2, Vcd, + K8SBareMetal, Kind, Kindinfra, FakeSingleCluster, Federation, FakeVmPool, + or 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 + type: string + properties: + additionalProperties: + $ref: '#/components/schemas/EdgeprotoPropertyInfo' + description: Single Key-Value pair of env var to be passed to CRM + type: object + type: object + EdgeprotoCloudletRefs: + properties: + cluster_insts: + description: Clusters instantiated on the Cloudlet + items: + $ref: '#/components/schemas/EdgeprotoClusterInstRefKey' + nullable: true + type: array + k8s_app_insts: + description: K8s apps instantiated on the Cloudlet + items: + $ref: '#/components/schemas/EdgeprotoAppInstRefKey' + nullable: true + type: array + key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + opt_res_used_map: + additionalProperties: + minimum: 0 + type: integer + description: Used Optional Resources + type: object + reserved_auto_cluster_ids: + description: Track reservable autoclusterinsts ids in use. This is a bitmap. + minimum: 0 + type: integer + root_lb_ports: + additionalProperties: + type: integer + description: 'Used ports on root load balancer. Map key is public port, + value is a bitmap for the protocol bitmap: bit 0: tcp, bit 1: udp' + type: object + used_dynamic_ips: + description: Used dynamic IPs + type: integer + used_static_ips: + description: Used static IPs + type: string + vm_app_insts: + description: VM apps instantiated on the Cloudlet + items: + $ref: '#/components/schemas/EdgeprotoAppInstRefKey' + nullable: true + type: array + type: object + EdgeprotoCloudletResMap: + properties: + key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + mapping: + additionalProperties: + type: string + description: Resource mapping info + type: object + type: object + EdgeprotoCloudletResourceQuotaProps: + properties: + organization: + description: Organization + type: string + platform_type: + description: Platform type, valid values are one of Fake, Dind, Openstack, + Azure, Gcp, Edgebox, Fakeinfra, Vsphere, AwsEks, VmPool, AwsEc2, Vcd, + K8SBareMetal, Kind, Kindinfra, FakeSingleCluster, Federation, FakeVmPool, + or 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 + type: string + properties: + description: Cloudlet resource properties + items: + $ref: '#/components/schemas/EdgeprotoInfraResource' + nullable: true + type: array + type: object + EdgeprotoCloudletResourceUsage: + properties: + info: + description: Infra Resource information + items: + $ref: '#/components/schemas/EdgeprotoInfraResource' + nullable: true + type: array + infra_usage: + description: Show Infra based usage + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + type: object + EdgeprotoClusterInst: + properties: + allocated_ip: + description: Allocated IP for dedicated access + type: string + auto: + description: Auto is set to true when automatically created by back-end + (internal use only) + type: boolean + auto_scale_policy: + description: Auto scale policy name + type: string + availability_zone: + description: Optional Resource AZ if any + type: string + created_at: + description: Created at time + type: string + crm_override: + description: Override actions to CRM, valid values are one of NoOverride, + IgnoreCrmErrors, IgnoreCrm, IgnoreTransientState, IgnoreCrmAndTransientState, + or 0, 1, 2, 3, 4 + type: string + delete_prepare: + description: Preparing to be deleted + type: boolean + deployment: + description: Deployment type (kubernetes or docker) + type: string + dns_label: + description: DNS label that is unique within the cloudlet and among other + AppInsts/ClusterInsts + type: string + errors: + description: Any errors trying to create, update, or delete the ClusterInst + on the Cloudlet. + items: + type: string + type: array + external_volume_size: + description: Size of external volume to be attached to nodes. This is for + the root partition + minimum: 0 + type: integer + flavor: + $ref: '#/components/schemas/EdgeprotoFlavorKey' + fqdn: + description: FQDN is a globally unique DNS id for the ClusterInst + type: string + image_name: + description: Optional resource specific image to launch + type: string + ip_access: + description: IP access type (RootLB Type), valid values are one of Unknown, + Dedicated, Shared, or 0, 1, 3 + type: string + key: + $ref: '#/components/schemas/EdgeprotoClusterInstKey' + liveness: + description: Liveness of instance (see Liveness), valid values are one of + Unknown, Static, Dynamic, Autoprov, or 0, 1, 2, 3 + type: string + master_node_flavor: + description: Generic flavor for k8s master VM when worker nodes > 0 + type: string + multi_tenant: + description: Multi-tenant kubernetes cluster + type: boolean + networks: + description: networks to connect to + items: + type: string + type: array + node_flavor: + description: Cloudlet specific node flavor + type: string + num_masters: + description: Number of k8s masters (In case of docker deployment, this field + is not required) + minimum: 0 + type: integer + num_nodes: + description: Number of k8s nodes (In case of docker deployment, this field + is not required) + minimum: 0 + type: integer + opt_res: + description: Optional Resources required by OS flavor if any + type: string + reservable: + description: If ClusterInst is reservable + type: boolean + reservation_ended_at: + description: For reservable ClusterInsts, when the last reservation ended + type: string + reserved_by: + description: For reservable EdgeCloud ClusterInsts, the current developer + tenant + type: string + resources: + $ref: '#/components/schemas/EdgeprotoInfraResources' + shared_volume_size: + description: Size of an optional shared volume to be mounted on the master + minimum: 0 + type: integer + skip_crm_cleanup_on_failure: + description: Prevents cleanup of resources on failure within CRM, used for + diagnostic purposes + type: boolean + state: + description: State of the cluster instance, valid values are one of TrackedStateUnknown, + NotPresent, CreateRequested, Creating, CreateError, Ready, UpdateRequested, + Updating, UpdateError, DeleteRequested, Deleting, DeleteError, DeletePrepare, + CrmInitok, CreatingDependencies, DeleteDone, or 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15 + type: string + updated_at: + description: Updated at time + type: string + type: object + EdgeprotoClusterInstKey: + properties: + cloudlet_key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + cluster_key: + $ref: '#/components/schemas/EdgeprotoClusterKey' + organization: + description: Name of Developer organization that this cluster belongs to + type: string + type: object + EdgeprotoClusterInstRefKey: + properties: + cluster_key: + $ref: '#/components/schemas/EdgeprotoClusterKey' + organization: + description: Name of Developer organization that this cluster belongs to + type: string + type: object + EdgeprotoClusterKey: + properties: + name: + description: Cluster name + type: string + type: object + EdgeprotoClusterRefs: + properties: + apps: + description: App instances in the Cluster Instance + items: + $ref: '#/components/schemas/EdgeprotoClusterRefsAppInstKey' + nullable: true + type: array + key: + $ref: '#/components/schemas/EdgeprotoClusterInstKey' + type: object + EdgeprotoClusterRefsAppInstKey: + properties: + app_key: + $ref: '#/components/schemas/EdgeprotoAppKey' + v_cluster_name: + description: Virtual cluster name + type: string + type: object + EdgeprotoCollectionInterval: + properties: + interval: + description: Collection interval for Influxdb (Specifically used for continuous + query intervals) (Data from old continuous queries will be inaccessible + if intervals are updated) + type: string + retention: + description: Retention duration for Influxdb interval (0 uses default retention + policy) + type: string + type: object + EdgeprotoConfigFile: + properties: + config: + description: Config file contents or URI reference + type: string + kind: + description: Kind (type) of config, i.e. envVarsYaml, helmCustomizationYaml + type: string + type: object + EdgeprotoContainerInfo: + properties: + clusterip: + description: IP within the CNI and is applicable to kubernetes only + type: string + name: + description: Name of the container + type: string + restarts: + description: Restart count, applicable to kubernetes only + type: integer + status: + description: Runtime status of the container + type: string + type: + description: Type can be docker or kubernetes + type: string + type: object + EdgeprotoDebugReply: + properties: + node: + $ref: '#/components/schemas/EdgeprotoNodeKey' + output: + description: Debug output, if any + type: string + type: object + EdgeprotoDebugRequest: + properties: + args: + description: Additional arguments for cmd + type: string + cmd: + description: Debug command (use "help" to see available commands) + type: string + id: + description: Id used internally + minimum: 0 + type: integer + levels: + description: 'Comma separated list of debug level names: etcd,api,notify,dmereq,locapi,infra,metrics,upgrade,info,sampled,fedapi' + type: string + node: + $ref: '#/components/schemas/EdgeprotoNodeKey' + pretty: + description: if possible, make output pretty + type: boolean + timeout: + description: custom timeout (duration, defaults to 10s) + type: string + type: object + EdgeprotoDeploymentCloudletRequest: + properties: + app: + $ref: '#/components/schemas/EdgeprotoApp' + dry_run_deploy: + description: Attempt to qualify cloudlet resources for deployment + type: boolean + num_nodes: + description: Optional number of worker VMs in dry run K8s Cluster, default + = 2 + minimum: 0 + type: integer + type: object + EdgeprotoDevice: + properties: + first_seen: + $ref: '#/components/schemas/TypesTimestamp' + key: + $ref: '#/components/schemas/EdgeprotoDeviceKey' + last_seen: + $ref: '#/components/schemas/TypesTimestamp' + notify_id: + description: Id of client assigned by server (internal use only) + type: integer + type: object + EdgeprotoDeviceKey: + properties: + unique_id: + description: Unique identification of the client device or user. May be + overridden by the server. + type: string + unique_id_type: + description: Type of unique ID provided by the client + type: string + type: object + EdgeprotoDeviceReport: + properties: + begin: + $ref: '#/components/schemas/TypesTimestamp' + end: + $ref: '#/components/schemas/TypesTimestamp' + key: + $ref: '#/components/schemas/EdgeprotoDeviceKey' + type: object + EdgeprotoExecRequest: + properties: + access_url: + description: Access URL + type: string + answer: + description: Answer + type: string + app_inst_key: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + cmd: + $ref: '#/components/schemas/EdgeprotoRunCmd' + console: + $ref: '#/components/schemas/EdgeprotoRunVMConsole' + container_id: + description: ContainerId is the name or ID of the target container, if applicable + type: string + edge_turn_addr: + description: EdgeTurn Server Address + type: string + err: + description: Any error message + type: string + log: + $ref: '#/components/schemas/EdgeprotoShowLog' + offer: + description: Offer + type: string + timeout: + description: Timeout + type: string + type: object + EdgeprotoFederationConfig: + properties: + federation_name: + description: Federation name + type: string + partner_federation_addr: + description: Partner federation address + type: string + partner_federation_id: + description: Partner federation ID + type: string + self_federation_id: + description: Self federation ID + type: string + zone_country_code: + description: Cloudlet zone country code + type: string + type: object + EdgeprotoFlavor: + properties: + delete_prepare: + description: Preparing to be deleted + type: boolean + disk: + description: Amount of disk space in gigabytes + minimum: 0 + type: integer + key: + $ref: '#/components/schemas/EdgeprotoFlavorKey' + opt_res_map: + additionalProperties: + type: string + description: 'Optional Resources request, key = gpu form: $resource=$kind:[$alias]$count + ex: optresmap=gpu=vgpu:nvidia-63:1' + type: object + ram: + description: RAM in megabytes + minimum: 0 + type: integer + vcpus: + description: Number of virtual CPUs + minimum: 0 + type: integer + type: object + EdgeprotoFlavorInfo: + properties: + disk: + description: Amount of disk in GB on the Cloudlet + minimum: 0 + type: integer + name: + description: Name of the flavor on the Cloudlet + type: string + prop_map: + additionalProperties: + type: string + description: OS Flavor Properties, if any + type: object + ram: + description: Ram in MB on the Cloudlet + minimum: 0 + type: integer + vcpus: + description: Number of VCPU cores on the Cloudlet + minimum: 0 + type: integer + type: object + EdgeprotoFlavorKey: + properties: + name: + description: Flavor name + type: string + type: object + EdgeprotoFlavorMatch: + properties: + availability_zone: + description: availability zone for optional resources if any + type: string + flavor_name: + description: Flavor name to lookup + type: string + key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + type: object + EdgeprotoFlowRateLimitSettings: + properties: + key: + $ref: '#/components/schemas/EdgeprotoFlowRateLimitSettingsKey' + settings: + $ref: '#/components/schemas/EdgeprotoFlowSettings' + type: object + EdgeprotoFlowRateLimitSettingsKey: + properties: + flow_settings_name: + description: Unique name for FlowRateLimitSettings (there can be multiple + FlowSettings per RateLimitSettingsKey) + type: string + rate_limit_key: + $ref: '#/components/schemas/EdgeprotoRateLimitSettingsKey' + type: object + EdgeprotoFlowSettings: + properties: + burst_size: + description: Burst size for flow rate limiting (required for TokenBucketAlgorithm) + type: integer + flow_algorithm: + description: Flow Rate Limit algorithm, valid values are one of UnknownFlowAlgorithm, + TokenBucketAlgorithm, LeakyBucketAlgorithm, or 0, 1, 2 + type: string + reqs_per_second: + description: Requests per second for flow rate limiting + type: number + type: object + EdgeprotoGPUConfig: + properties: + driver: + $ref: '#/components/schemas/EdgeprotoGPUDriverKey' + license_config: + description: Cloudlet specific license config to setup license (will be + stored in secure storage) + type: string + license_config_md5sum: + description: Cloudlet specific license config md5sum, to ensure integrity + of license config + type: string + properties: + additionalProperties: + type: string + description: Properties to identify specifics of GPU + type: object + type: object + EdgeprotoGPUDriver: + properties: + builds: + description: List of GPU driver build + items: + $ref: '#/components/schemas/EdgeprotoGPUDriverBuild' + nullable: true + type: array + delete_prepare: + description: Preparing to be deleted + type: boolean + ignore_state: + description: Ignore state will ignore any action in-progress on the GPU + driver + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoGPUDriverKey' + license_config: + description: License config to setup license (will be stored in secure storage) + type: string + license_config_md5sum: + description: License config md5sum, to ensure integrity of license config + type: string + license_config_storage_path: + description: GPU driver license config storage path + type: string + properties: + additionalProperties: + type: string + description: 'Additional properties associated with GPU driver build For + example: license server information, driver release date, etc' + type: object + state: + description: State to figure out if any action on the GPU driver is in-progress + type: string + storage_bucket_name: + description: GPU driver storage bucket name + type: string + type: object + EdgeprotoGPUDriverBuild: + properties: + driver_path: + description: Path where the driver package is located, if it is authenticated + path, then credentials must be passed as part of URL (one-time download + path) + type: string + driver_path_creds: + description: Optional credentials (username:password) to access driver path + type: string + hypervisor_info: + description: Info on hypervisor supported by vGPU driver + type: string + kernel_version: + description: Kernel Version supported by GPU driver build + type: string + md5sum: + description: Driver package md5sum to ensure package is not corrupted + type: string + name: + description: Unique identifier key + type: string + operating_system: + description: Operator System supported by GPU driver build, valid values + are one of Linux, Windows, Others, or 0, 1, 20 + type: string + storage_path: + description: GPU driver build storage path + type: string + type: object + EdgeprotoGPUDriverBuildMember: + properties: + build: + $ref: '#/components/schemas/EdgeprotoGPUDriverBuild' + ignore_state: + description: Ignore state will ignore any action in-progress on the GPU + driver + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoGPUDriverKey' + type: object + EdgeprotoGPUDriverBuildURL: + properties: + build_url_path: + description: Build URL path + type: string + validity: + description: Build URL path validity + type: string + type: object + EdgeprotoGPUDriverKey: + properties: + name: + description: Name of the driver + type: string + organization: + description: Organization to which the driver belongs to + type: string + type: object + EdgeprotoIdleReservableClusterInsts: + properties: + idle_time: + description: Idle time (duration) + type: string + type: object + EdgeprotoInfraConfig: + properties: + external_network_name: + description: Infra specific external network name + type: string + flavor_name: + description: Infra specific flavor name + type: string + type: object + EdgeprotoInfraResource: + properties: + alert_threshold: + description: Generate alert when more than threshold percentage of resource + is used + type: integer + description: + description: Resource description + type: string + infra_max_value: + description: Resource infra max value + minimum: 0 + type: integer + name: + description: Resource name + type: string + quota_max_value: + description: Resource quota max value + minimum: 0 + type: integer + units: + description: Resource units + type: string + value: + description: Resource value + minimum: 0 + type: integer + type: object + EdgeprotoInfraResources: + properties: + vms: + description: Virtual machine resources info + items: + $ref: '#/components/schemas/EdgeprotoVmInfo' + nullable: true + type: array + type: object + EdgeprotoInfraResourcesSnapshot: + properties: + cluster_insts: + description: List of clusterinsts this resources snapshot represent + items: + $ref: '#/components/schemas/EdgeprotoClusterInstRefKey' + nullable: true + type: array + info: + description: Infra Resource information + items: + $ref: '#/components/schemas/EdgeprotoInfraResource' + nullable: true + type: array + k8s_app_insts: + description: List of k8s appinsts this resources snapshot represent + items: + $ref: '#/components/schemas/EdgeprotoAppInstRefKey' + nullable: true + type: array + platform_vms: + description: Virtual machine resources info + items: + $ref: '#/components/schemas/EdgeprotoVmInfo' + nullable: true + type: array + vm_app_insts: + description: List of vm appinsts this resources snapshot represent + items: + $ref: '#/components/schemas/EdgeprotoAppInstRefKey' + nullable: true + type: array + type: object + EdgeprotoIpAddr: + properties: + externalIp: + description: External IP address + type: string + internalIp: + description: Internal IP address + type: string + type: object + EdgeprotoMaxReqsRateLimitSettings: + properties: + key: + $ref: '#/components/schemas/EdgeprotoMaxReqsRateLimitSettingsKey' + settings: + $ref: '#/components/schemas/EdgeprotoMaxReqsSettings' + type: object + EdgeprotoMaxReqsRateLimitSettingsKey: + properties: + max_reqs_settings_name: + description: Unique name for MaxReqsRateLimitSettings (there can be multiple + MaxReqsSettings per RateLimitSettingsKey) + type: string + rate_limit_key: + $ref: '#/components/schemas/EdgeprotoRateLimitSettingsKey' + type: object + EdgeprotoMaxReqsSettings: + properties: + interval: + description: Time interval + type: string + max_reqs_algorithm: + description: MaxReqs Rate Limit Algorithm, valid values are one of UnknownMaxReqsAlgorithm, + FixedWindowAlgorithm, or 0, 1 + type: string + max_requests: + description: Maximum number of requests for the given Interval + type: integer + type: object + EdgeprotoNetwork: + properties: + connection_type: + description: Network connection type, valid values are one of Undefined, + ConnectToLoadBalancer, ConnectToClusterNodes, ConnectToAll, or 0, 1, 2, + 3 + type: string + delete_prepare: + description: Preparing to be deleted + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoNetworkKey' + routes: + description: List of routes + items: + $ref: '#/components/schemas/EdgeprotoRoute' + nullable: true + type: array + type: object + EdgeprotoNetworkKey: + properties: + cloudlet_key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + name: + description: Network Name + type: string + type: object + EdgeprotoNode: + properties: + build_author: + description: Build Author + type: string + build_date: + description: Build Date + type: string + build_head: + description: Build Head Version + type: string + build_master: + description: Build Master Version + type: string + container_version: + description: Docker edge-cloud container version which node instance use + type: string + hostname: + description: Hostname + type: string + internal_pki: + description: Internal PKI Config + type: string + key: + $ref: '#/components/schemas/EdgeprotoNodeKey' + notify_id: + description: Id of client assigned by server (internal use only) + type: integer + properties: + additionalProperties: + type: string + description: Additional properties + type: object + type: object + EdgeprotoNodeInfo: + properties: + allocatable: + additionalProperties: + $ref: '#/components/schemas/EdgeprotoUdec64' + description: Maximum allocatable resources on the node (capacity - overhead) + type: object + capacity: + additionalProperties: + $ref: '#/components/schemas/EdgeprotoUdec64' + description: Capacity of underlying resources on the node + type: object + name: + description: Node name + type: string + type: object + EdgeprotoNodeKey: + properties: + cloudlet_key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + name: + description: Name or hostname of node + type: string + region: + description: Region the node is in + type: string + type: + description: Node type + type: string + type: object + EdgeprotoOSAZone: + properties: + name: + description: OpenStack availability zone name + type: string + status: + description: OpenStack availability zone status + type: string + type: object + EdgeprotoOSImage: + properties: + disk_format: + description: format qcow2, img, etc + type: string + name: + description: image name + type: string + properties: + description: image properties/metadata + type: string + tags: + description: optional tags present on image + type: string + type: object + EdgeprotoOperationTimeLimits: + properties: + create_app_inst_timeout: + description: Override default max time to create an app instance (duration) + type: string + create_cluster_inst_timeout: + description: Override default max time to create a cluster instance (duration) + type: string + delete_app_inst_timeout: + description: Override default max time to delete an app instance (duration) + type: string + delete_cluster_inst_timeout: + description: Override default max time to delete a cluster instance (duration) + type: string + update_app_inst_timeout: + description: Override default max time to update an app instance (duration) + type: string + update_cluster_inst_timeout: + description: Override default max time to update a cluster instance (duration) + type: string + type: object + EdgeprotoOperatorCode: + properties: + code: + description: MCC plus MNC code, or custom carrier code designation. + type: string + organization: + description: Operator Organization name + type: string + type: object + EdgeprotoOrganization: + properties: + name: + description: Organization name + type: string + type: object + EdgeprotoPlatformConfig: + properties: + access_api_addr: + description: controller access API address + type: string + app_dns_root: + description: App domain name root + type: string + cache_dir: + description: cache dir + type: string + chef_client_interval: + description: Chef client interval + type: string + chef_server_path: + description: Path to Chef Server + type: string + cleanup_mode: + description: Internal cleanup flag + type: boolean + cloudlet_vm_image_path: + description: Path to platform base image + type: string + commercial_certs: + description: Get certs from vault or generate your own for the root load + balancer + type: boolean + container_registry_path: + description: Path to Docker registry holding edge-cloud image + type: string + crm_access_private_key: + description: crm access private key + type: string + deployment_tag: + description: Deployment Tag + type: string + env_var: + additionalProperties: + type: string + description: Environment variables + type: object + notify_ctrl_addrs: + description: Address of controller notify port (can be multiple of these) + type: string + platform_tag: + description: Tag of edge-cloud image + type: string + region: + description: Region + type: string + secondary_crm_access_private_key: + description: secondary crm access private key + type: string + span: + description: Span string + type: string + test_mode: + description: Internal Test flag + type: boolean + thanos_recv_addr: + description: Thanos Receive remote write address + type: string + tls_ca_file: + description: TLS ca file + type: string + tls_cert_file: + description: TLS cert file + type: string + tls_key_file: + description: TLS key file + type: string + use_vault_pki: + description: Use Vault certs and CAs for internal TLS communication + type: boolean + type: object + EdgeprotoPolicyKey: + properties: + name: + description: Policy name + type: string + organization: + description: Name of the organization for the cluster that this policy will + apply to + type: string + type: object + EdgeprotoPropertyInfo: + properties: + description: + description: Description of the property + type: string + internal: + description: Is the property internal, not to be set by Operator + type: boolean + mandatory: + description: Is the property mandatory + type: boolean + name: + description: Name of the property + type: string + secret: + description: Is the property a secret value, will be hidden + type: boolean + value: + description: Default value of the property + type: string + type: object + EdgeprotoRateLimitSettings: + properties: + flow_settings: + additionalProperties: + $ref: '#/components/schemas/EdgeprotoFlowSettings' + description: 'Map of FlowSettings (key: FlowSettingsName, value: FlowSettings)' + type: object + key: + $ref: '#/components/schemas/EdgeprotoRateLimitSettingsKey' + max_reqs_settings: + additionalProperties: + $ref: '#/components/schemas/EdgeprotoMaxReqsSettings' + description: 'Map of MaxReqsSettings (key: MaxReqsSettingsName, value: MaxReqsSettings)' + type: object + type: object + EdgeprotoRateLimitSettingsKey: + properties: + api_endpoint_type: + description: API Endpoint type, valid values are one of UnknownApiEndpointType, + Dme, or 0, 1 + type: string + api_name: + description: Name of API (eg. CreateApp or RegisterClient) (Use "Global" + if not a specific API) + type: string + rate_limit_target: + description: Target to rate limit, valid values are one of UnknownTarget, + AllRequests, PerIp, PerUser, or 0, 1, 2, 3 + type: string + type: object + EdgeprotoResTagTable: + properties: + azone: + description: Availability zone(s) of resource if required + type: string + delete_prepare: + description: Preparing to be deleted + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoResTagTableKey' + tags: + additionalProperties: + type: string + description: One or more string tags + type: object + type: object + EdgeprotoResTagTableKey: + properties: + name: + description: Resource Table Name + type: string + organization: + description: Operator organization of the cloudlet site. + type: string + type: object + EdgeprotoResourceQuota: + properties: + alert_threshold: + description: Generate alert when more than threshold percentage of resource + is used + type: integer + name: + description: Resource name on which to set quota + type: string + value: + description: Quota value of the resource + minimum: 0 + type: integer + type: object + EdgeprotoResult: + properties: + code: + description: Error code, 0 indicates success, non-zero indicates failure + (not implemented) + type: integer + message: + description: Message, may be success or failure message + type: string + type: object + EdgeprotoRoute: + properties: + destination_cidr: + description: Destination CIDR + type: string + next_hop_ip: + description: Next hop IP + type: string + type: object + EdgeprotoRunCmd: + properties: + cloudlet_mgmt_node: + $ref: '#/components/schemas/EdgeprotoCloudletMgmtNode' + command: + description: Command or Shell + type: string + type: object + EdgeprotoRunVMConsole: + properties: + url: + description: VM Console URL + type: string + type: object + EdgeprotoSecurityRule: + properties: + port_range_max: + description: TCP or UDP port range end + minimum: 0 + type: integer + port_range_min: + description: TCP or UDP port range start + minimum: 0 + type: integer + protocol: + description: TCP, UDP, ICMP + type: string + remote_cidr: + description: Remote CIDR X.X.X.X/X + type: string + type: object + EdgeprotoServerlessConfig: + properties: + min_replicas: + description: Minimum number of replicas when serverless + minimum: 0 + type: integer + ram: + description: RAM allocation in megabytes per container when serverless + minimum: 0 + type: integer + vcpus: + description: Virtual CPUs allocation per container when serverless, may + be decimal in increments of 0.001 + type: string + type: object + EdgeprotoSettings: + properties: + alert_policy_min_trigger_time: + description: Minimmum trigger time for alert policies + type: string + appinst_client_cleanup_interval: + description: AppInstClient cleanup thread run interval + type: string + auto_deploy_interval_sec: + description: Auto Provisioning Stats push and analysis interval (seconds) + type: number + auto_deploy_max_intervals: + description: Auto Provisioning Policy max allowed intervals + minimum: 0 + type: integer + auto_deploy_offset_sec: + description: Auto Provisioning analysis offset from interval (seconds) + type: number + chef_client_interval: + description: Default chef client interval (duration) + type: string + cleanup_reservable_auto_cluster_idletime: + description: Idle reservable ClusterInst clean up time + type: string + cloudlet_maintenance_timeout: + description: Default Cloudlet Maintenance timeout (used twice for AutoProv + and Cloudlet) + type: string + cluster_auto_scale_averaging_duration_sec: + description: Cluster auto scale averaging duration for stats to avoid spikes + (seconds), avoid setting below 30s or it will not capture any measurements + to average + type: integer + cluster_auto_scale_retry_delay: + description: Cluster auto scale retry delay if scaling failed + type: string + create_app_inst_timeout: + description: Create AppInst timeout (duration) + type: string + create_cloudlet_timeout: + description: Create Cloudlet timeout (duration) + type: string + create_cluster_inst_timeout: + description: Create ClusterInst timeout (duration) + type: string + delete_app_inst_timeout: + description: Delete AppInst timeout (duration) + type: string + delete_cluster_inst_timeout: + description: Delete ClusterInst timeout (duration) + type: string + disable_rate_limit: + description: Disable rate limiting for APIs (default is false) + type: boolean + dme_api_metrics_collection_interval: + description: Metrics collection interval for DME API counts (duration) + type: string + edge_events_metrics_collection_interval: + description: Collection interval for edgeevents metrics (latency, device, + and custom) + type: string + edge_events_metrics_continuous_queries_collection_intervals: + description: List of collection intervals for Continuous Queries for EdgeEvents + metrics + items: + $ref: '#/components/schemas/EdgeprotoCollectionInterval' + type: array + influx_db_cloudlet_usage_metrics_retention: + description: Default influxDB cloudlet usage metrics retention policy (duration) + type: string + influx_db_downsampled_metrics_retention: + description: Default retention policy for downsampled influx db (duration) + type: string + influx_db_edge_events_metrics_retention: + description: Default retention policy for edgeevents metrics influx db (duration) + type: string + influx_db_metrics_retention: + description: Default influxDB metrics retention policy (duration) + type: string + location_tile_side_length_km: + description: Length of location tiles side for latency metrics (km) + type: integer + master_node_flavor: + description: Default flavor for k8s master VM and > 0 workers + type: string + max_tracked_dme_clients: + description: Max DME clients to be tracked at the same time. + type: integer + platform_ha_instance_active_expire_time: + description: Platform HA instance active time + type: string + platform_ha_instance_poll_interval: + description: Platform HA instance poll interval + type: string + rate_limit_max_tracked_ips: + description: Maximum number of IPs to track for rate limiting + type: integer + resource_snapshot_thread_interval: + description: ResourceSnapshot Refresh thread run interval + type: string + shepherd_alert_evaluation_interval: + description: Shepherd alert evaluation interval for k8s and docker appInstances + (duration) + type: string + shepherd_health_check_interval: + description: Health Checking probing frequency (duration) + type: string + shepherd_health_check_retries: + description: Number of times Shepherd Health Check fails before we mark + appInst down + type: integer + shepherd_metrics_collection_interval: + description: Shepherd metrics collection interval for k8s and docker appInstances + (duration) + type: string + shepherd_metrics_scrape_interval: + description: Shepherd metrics scraping interval (how often metrics are pulled + by prometheus, vs pushed to Controller by Shepherd collection) + type: string + update_app_inst_timeout: + description: Update AppInst timeout (duration) + type: string + update_cloudlet_timeout: + description: Update Cloudlet timeout (duration) + type: string + update_cluster_inst_timeout: + description: Update ClusterInst timeout (duration) + type: string + update_trust_policy_timeout: + description: Update Trust Policy timeout (duration) + type: string + update_vm_pool_timeout: + description: Update VM pool timeout (duration) + type: string + type: object + EdgeprotoShowLog: + properties: + follow: + description: Stream data + type: boolean + since: + description: Show logs since either a duration ago (5s, 2m, 3h) or a timestamp + (RFC3339) + type: string + tail: + description: Show only a recent number of lines + type: integer + timestamps: + description: Show timestamps + type: boolean + type: object + EdgeprotoStatusInfo: + properties: + max_tasks: + description: Max tasks + minimum: 0 + type: integer + msg_count: + description: Message count + minimum: 0 + type: integer + msgs: + description: Messages + items: + type: string + type: array + step_name: + description: Step name + type: string + task_name: + description: Task name + type: string + task_number: + description: Task number + minimum: 0 + type: integer + type: object + EdgeprotoTimeRange: + properties: + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + EdgeprotoTrustPolicy: + properties: + delete_prepare: + description: Preparing to be deleted + type: boolean + key: + $ref: '#/components/schemas/EdgeprotoPolicyKey' + outbound_security_rules: + description: List of outbound security rules for whitelisting traffic + items: + $ref: '#/components/schemas/EdgeprotoSecurityRule' + nullable: true + type: array + type: object + EdgeprotoTrustPolicyException: + properties: + key: + $ref: '#/components/schemas/EdgeprotoTrustPolicyExceptionKey' + outbound_security_rules: + description: List of outbound security rules for whitelisting traffic + items: + $ref: '#/components/schemas/EdgeprotoSecurityRule' + nullable: true + type: array + state: + description: State of the exception within the approval process, valid values + are one of Unknown, ApprovalRequested, Active, Rejected, or 0, 1, 2, 3 + type: string + type: object + EdgeprotoTrustPolicyExceptionKey: + properties: + app_key: + $ref: '#/components/schemas/EdgeprotoAppKey' + cloudlet_pool_key: + $ref: '#/components/schemas/EdgeprotoCloudletPoolKey' + name: + description: TrustPolicyExceptionKey name + type: string + type: object + EdgeprotoUdec64: + properties: + nanos: + description: Decimal value in nanos + minimum: 0 + type: integer + whole: + description: Whole number value + minimum: 0 + type: integer + type: object + EdgeprotoVM: + properties: + flavor: + $ref: '#/components/schemas/EdgeprotoFlavorInfo' + group_name: + description: VM Group Name + type: string + internal_name: + description: VM Internal Name + type: string + name: + description: VM Name + type: string + net_info: + $ref: '#/components/schemas/EdgeprotoVMNetInfo' + state: + description: VM State, valid values are one of Free, InProgress, InUse, + Add, Remove, Update, ForceFree, or 0, 1, 2, 3, 4, 5, 6 + type: string + updated_at: + $ref: '#/components/schemas/TypesTimestamp' + type: object + EdgeprotoVMNetInfo: + properties: + external_ip: + description: External IP + type: string + internal_ip: + description: Internal IP + type: string + type: object + EdgeprotoVMPool: + properties: + crm_override: + description: Override actions to CRM, valid values are one of NoOverride, + IgnoreCrmErrors, IgnoreCrm, IgnoreTransientState, IgnoreCrmAndTransientState, + or 0, 1, 2, 3, 4 + type: string + delete_prepare: + description: Preparing to be deleted + type: boolean + errors: + description: Any errors trying to add/remove VM to/from VM Pool + items: + type: string + type: array + key: + $ref: '#/components/schemas/EdgeprotoVMPoolKey' + state: + description: Current state of the VM pool, valid values are one of TrackedStateUnknown, + NotPresent, CreateRequested, Creating, CreateError, Ready, UpdateRequested, + Updating, UpdateError, DeleteRequested, Deleting, DeleteError, DeletePrepare, + CrmInitok, CreatingDependencies, DeleteDone, or 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15 + type: string + vms: + description: list of VMs to be part of VM pool + items: + $ref: '#/components/schemas/EdgeprotoVM' + nullable: true + type: array + type: object + EdgeprotoVMPoolKey: + properties: + name: + description: Name of the vmpool + type: string + organization: + description: Organization of the vmpool + type: string + type: object + EdgeprotoVMPoolMember: + properties: + crm_override: + description: Override actions to CRM, valid values are one of NoOverride, + IgnoreCrmErrors, IgnoreCrm, IgnoreTransientState, IgnoreCrmAndTransientState, + or 0, 1, 2, 3, 4 + type: string + key: + $ref: '#/components/schemas/EdgeprotoVMPoolKey' + vm: + $ref: '#/components/schemas/EdgeprotoVM' + type: object + EdgeprotoVirtualClusterInstKey: + properties: + cloudlet_key: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + cluster_key: + $ref: '#/components/schemas/EdgeprotoClusterKey' + organization: + description: Name of Developer organization that this cluster belongs to + type: string + type: object + EdgeprotoVmInfo: + properties: + containers: + description: Information about containers running in the VM + items: + $ref: '#/components/schemas/EdgeprotoContainerInfo' + type: array + infraFlavor: + description: Flavor allocated within the cloudlet infrastructure, distinct + from the control plane flavor + type: string + ipaddresses: + description: IP addresses allocated to the VM + items: + $ref: '#/components/schemas/EdgeprotoIpAddr' + nullable: true + type: array + name: + description: Virtual machine name + type: string + status: + description: Runtime status of the VM + type: string + type: + description: Type can be platformvm, platform-cluster-master, platform-cluster-primary-node, + platform-cluster-secondary-node, sharedrootlb, dedicatedrootlb, cluster-master, + cluster-k8s-node, cluster-docker-node, appvm + type: string + type: object + NodeAggrVal: + properties: + count: + description: Count of number of documents associated with key + type: integer + key: + description: Key + type: string + type: object + NodeEventData: + properties: + error: + description: Error if event is logging a failure + type: string + mtags: + additionalProperties: + type: string + description: Tags associated with event + type: object + name: + description: Name of event + type: string + org: + description: Organizations that scan see event + items: + type: string + nullable: true + type: array + region: + description: Region in which event happened + type: string + tags: + description: Tags associated with event + items: + $ref: '#/components/schemas/NodeEventTag' + type: array + timestamp: + description: Timestamp of event + format: date-time + type: string + type: + description: Type of event, audit or event + type: string + type: object + NodeEventMatch: + properties: + error: + description: Error substring to match + type: string + failed: + description: Failure status on event to match + type: boolean + names: + description: Names of events to match + items: + type: string + nullable: true + type: array + orgs: + description: Organizations on events to match + items: + type: string + nullable: true + type: array + regions: + description: Regions on events to match + items: + type: string + type: array + tags: + additionalProperties: + type: string + description: Tags on events to match + nullable: true + type: object + types: + description: Types of events to match + items: + type: string + nullable: true + type: array + type: object + NodeEventSearch: + properties: + allowedorgs: + description: Organizations allowed to access the event + items: + type: string + nullable: true + type: array + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + from: + description: Start offset if paging through results + type: integer + limit: + description: Display the last X events + type: integer + match: + $ref: '#/components/schemas/NodeEventMatch' + notmatch: + $ref: '#/components/schemas/NodeEventMatch' + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + NodeEventTag: + properties: + key: + description: Event tag key + type: string + value: + description: Event tag value + type: string + type: object + NodeEventTerms: + properties: + names: + description: Names of events + items: + $ref: '#/components/schemas/NodeAggrVal' + type: array + orgs: + description: Organizations on events + items: + $ref: '#/components/schemas/NodeAggrVal' + type: array + regions: + description: Regions on events + items: + $ref: '#/components/schemas/NodeAggrVal' + type: array + tagkeys: + description: Tag keys on events + items: + $ref: '#/components/schemas/NodeAggrVal' + type: array + types: + description: Types of events + items: + $ref: '#/components/schemas/NodeAggrVal' + type: array + type: object + NodeSpanLogOut: + properties: + keyvalues: + additionalProperties: {} + nullable: true + type: object + lineno: + type: string + msg: + type: string + timestamp: + format: date-time + type: string + type: object + NodeSpanMatch: + properties: + hostnames: + items: + type: string + nullable: true + type: array + logkeyvalues: + additionalProperties: + type: string + nullable: true + type: object + logmsgs: + items: + type: string + nullable: true + type: array + logvalues: + items: + type: string + nullable: true + type: array + operations: + items: + type: string + nullable: true + type: array + services: + items: + type: string + nullable: true + type: array + spanids: + items: + type: string + nullable: true + type: array + tagkeyvalues: + additionalProperties: + type: string + nullable: true + type: object + tagvalues: + items: + type: string + nullable: true + type: array + traceids: + items: + type: string + nullable: true + type: array + type: object + NodeSpanOutCondensed: + properties: + duration: + type: string + hostname: + type: string + logs: + items: + $ref: '#/components/schemas/NodeSpanLogOut' + type: array + operation: + type: string + service: + type: string + spanid: + type: string + starttime: + format: date-time + type: string + tags: + additionalProperties: {} + type: object + traceid: + type: string + type: object + NodeSpanSearch: + properties: + TimeRange: + $ref: '#/components/schemas/EdgeprotoTimeRange' + from: + type: integer + limit: + type: integer + match: + $ref: '#/components/schemas/NodeSpanMatch' + notmatch: + $ref: '#/components/schemas/NodeSpanMatch' + searchbyrelevance: + type: boolean + type: object + NodeSpanTerms: + properties: + hostnames: + items: + $ref: '#/components/schemas/NodeAggrVal' + nullable: true + type: array + msgs: + items: + $ref: '#/components/schemas/NodeAggrVal' + nullable: true + type: array + operations: + items: + $ref: '#/components/schemas/NodeAggrVal' + nullable: true + type: array + services: + items: + $ref: '#/components/schemas/NodeAggrVal' + nullable: true + type: array + tags: + items: + $ref: '#/components/schemas/NodeAggrVal' + nullable: true + type: array + type: object + OrmapiAccountInfo: + properties: + AccountId: + description: Account ID given by the billing platform + type: string + OrgName: + description: Billing Organization name to commit + type: string + ParentId: + description: Parent ID + type: string + SubscriptionId: + description: Subscription ID given by the billing platform + type: string + Type: + description: Type, either parent, child, or self + type: string + type: object + OrmapiAlertReceiver: + properties: + AppInst: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + Cloudlet: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + Email: + description: Custom receiving email + type: string + Name: + description: Receiver Name + type: string + PagerDutyApiVersion: + description: PagerDuty API version + type: string + PagerDutyIntegrationKey: + description: PagerDuty integration key + type: string + Region: + description: Region for the alert receiver + type: string + Severity: + description: Alert severity filter + type: string + SlackChannel: + description: Custom slack channel + type: string + SlackWebhook: + description: Custom slack webhook + type: string + Type: + description: Receiver type. Eg. email, slack, pagerduty + type: string + User: + description: User that created this receiver + type: string + type: object + OrmapiAllMetrics: + properties: + data: + description: Metrics data + items: + $ref: '#/components/schemas/OrmapiMetricData' + nullable: true + type: array + type: object + OrmapiBillingOrganization: + properties: + Address: + description: Organization address + type: string + Address2: + description: Organization address2 + type: string + Children: + description: Children belonging to this BillingOrganization + type: string + City: + description: Organization city + type: string + Country: + description: Organization country + type: string + CreatedAt: + description: Time created + format: date-time + readOnly: true + type: string + DeleteInProgress: + description: Delete of this BillingOrganization is in progress + readOnly: true + type: boolean + Email: + description: Organization email + type: string + FirstName: + description: Billing info first name + type: string + LastName: + description: Billing info last name + type: string + Name: + description: BillingOrganization name. Can only contain letters, digits, + underscore, period, hyphen. It cannot have leading or trailing spaces + or period. It cannot start with hyphen + type: string + Phone: + description: Organization phone number + type: string + PostalCode: + description: Organization postal code + type: string + State: + description: Organization state + type: string + Type: + description: 'Organization type: "parent" or "self"' + type: string + UpdatedAt: + description: Time last updated + format: date-time + readOnly: true + type: string + type: object + OrmapiConfig: + properties: + AdminPasswordMinCrackTimeSec: + description: Admin accounts min password crack time seconds (a measure of + strength) + type: number + ApiKeyLoginTokenValidDuration: + description: API key login token valid duration (in format 2h30m10s, default + 4h) + type: string + BillingEnable: + description: Toggle for enabling billing (primarily for testing purposes) + type: boolean + DisableRateLimit: + description: Toggle to enable and disable MC API rate limiting + type: boolean + FailedLoginLockoutThreshold1: + description: Failed login lockout threshold 1, after this count, lockout + time 1 is enabled (default 3) + type: integer + FailedLoginLockoutThreshold2: + description: Failed login lockout threshold 2, after this count, lockout + time 2 is enabled (default 10) + type: integer + FailedLoginLockoutTimeSec1: + description: Number of seconds to lock account from logging in after threshold + 1 is hit (default 60) + type: integer + FailedLoginLockoutTimeSec2: + description: Number of seconds to lock account from logging in after threshold + 2 is hit (default 300) + type: integer + LockNewAccounts: + description: Lock new accounts (must be unlocked by admin) + type: boolean + MaxMetricsDataPoints: + description: InfluxDB max number of data points returned + type: integer + NotifyEmailAddress: + description: Email to notify when locked account is created, defaults to + SupportEmail + type: string + PasswordMinCrackTimeSec: + description: User accounts min password crack time seconds (a measure of + strength) + type: number + RateLimitMaxTrackedIps: + description: Maximum number of IPs tracked per API group for rate limiting + at MC + type: integer + RateLimitMaxTrackedUsers: + description: Maximum number of users tracked per API group for rate limiting + at MC + type: integer + SkipVerifyEmail: + description: Skip email verification for new accounts (testing only) + type: boolean + SlackIconURL: + description: Slack icon URL used for alert manager slack receivers + type: string + SupportEmail: + description: Support email address shown to users, i.e. support@edgecloud.net + type: string + UserApiKeyCreateLimit: + description: Max number of API keys a user can create + type: integer + UserLoginTokenValidDuration: + description: User login token valid duration (in format 2h30m10s, default + 24h) + type: string + WebsocketTokenValidDuration: + description: Websocket auth token valid duration (in format 2h30m10s, default + 2m) + type: string + type: object + OrmapiController: + properties: + Address: + description: Controller API address or URL + type: string + CreatedAt: + description: Time created + format: date-time + readOnly: true + type: string + DnsRegion: + description: Unique DNS label for the region + readOnly: true + type: string + InfluxDB: + description: InfluxDB address + type: string + NotifyAddr: + description: Controller notify address or URL + type: string + Region: + description: Controller region name + type: string + ThanosMetrics: + description: Thanos Query URL + type: string + UpdatedAt: + description: Time last updated + format: date-time + readOnly: true + type: string + type: object + OrmapiCreateUser: + properties: + CreatedAt: + description: Time created + format: date-time + readOnly: true + type: string + Email: + description: User email + type: string + EmailVerified: + description: Email address has been verified + readOnly: true + type: boolean + EnableTOTP: + description: Enable or disable temporary one-time passwords for the account + type: boolean + FailedLogins: + description: Number of failed login attempts since last successful login + type: integer + FamilyName: + description: Family Name + type: string + GivenName: + description: Given Name + type: string + LastFailedLogin: + description: Last failed login time + format: date-time + readOnly: true + type: string + LastLogin: + description: Last successful login time + format: date-time + readOnly: true + type: string + Locked: + description: Account is locked + readOnly: true + type: boolean + Metadata: + description: Metadata + type: string + Name: + description: User name. Can only contain letters, digits, underscore, period, + hyphen. It cannot have leading or trailing spaces or period. It cannot + start with hyphen + type: string + Nickname: + description: Nick Name + type: string + PassCrackTimeSec: + description: Password strength in terms of brute-force cracking time + readOnly: true + type: number + Picture: + description: Picture (currently not used) + type: string + UpdatedAt: + description: Time last updated + format: date-time + readOnly: true + type: string + verify: + $ref: '#/components/schemas/OrmapiEmailRequest' + type: object + OrmapiCreateUserApiKey: + properties: + ApiKey: + description: API key + type: string + CreatedAt: + description: Time created + format: date-time + readOnly: true + type: string + Description: + description: Description of the purpose of this API key + type: string + Id: + description: API key ID used as an identifier for API keys + readOnly: true + type: string + Org: + description: Org to which API key has permissions to access its objects + type: string + permissions: + description: List of API key permissions + items: + $ref: '#/components/schemas/OrmapiRolePerm' + nullable: true + type: array + type: object + OrmapiDownloadReport: + properties: + Filename: + description: Name of the report file to be downloaded + type: string + Org: + description: Organization name + type: string + Reporter: + description: Reporter name + type: string + type: object + OrmapiEmailRequest: + properties: + email: + description: User's email address + readOnly: true + type: string + type: object + OrmapiFederatedPartnerZone: + properties: + Registered: + description: Zone registered by self federator + readOnly: true + type: boolean + city: + description: Comma seperated list of cities under this zone + type: string + cloudlets: + $ref: '#/components/schemas/PqStringArray' + countrycode: + description: ISO 3166-1 Alpha-2 code for the country where operator platform + is located + type: string + federationname: + description: Name of the Federation + type: string + geolocation: + description: GPS co-ordinates associated with the zone (in decimal format) + type: string + locality: + description: Type of locality eg rural, urban etc. + type: string + operatorid: + description: Globally unique string to identify an operator platform + type: string + region: + description: Region in which cloudlets reside + type: string + revision: + description: Revision ID to track object changes. We use jaeger traceID + for easy debugging but this can differ with what partner federator uses + readOnly: true + type: string + selfoperatorid: + description: Self operator ID + type: string + state: + description: Comma seperated list of states under this zone + type: string + zoneid: + description: Globally unique string used to authenticate operations over + federation interface + type: string + type: object + OrmapiFederatedSelfZone: + properties: + Registered: + description: Zone registered by partner federator + readOnly: true + type: boolean + federationname: + description: Name of the Federation + type: string + revision: + description: Revision ID to track object changes. We use jaeger traceID + for easy debugging but this can differ with what partner federator uses + readOnly: true + type: string + selfoperatorid: + description: Self operator ID + type: string + zoneid: + description: Globally unique identifier of the federator zone + type: string + type: object + OrmapiFederatedZoneRegRequest: + properties: + federationname: + description: Name of the Federation + type: string + selfoperatorid: + description: Self operator ID + type: string + zones: + description: Partner federator zones to be registered/deregistered + items: + type: string + nullable: true + type: array + type: object + OrmapiFederation: + properties: + PartnerRoleAccessToSelfZones: + description: Partner is allowed access to self federator zones as part of + federation + readOnly: true + type: boolean + PartnerRoleShareZonesWithSelf: + description: Partner shares its zones with self federator as part of federation + readOnly: true + type: boolean + apikey: + description: API Key used for authentication (stored in secure storage) + type: string + countrycode: + description: ISO 3166-1 Alpha-2 code for the country where operator platform + is located + type: string + federationaddr: + description: Federation access point address + type: string + federationid: + description: Globally unique string used to indentify a federation with + partner federation + type: string + locatorendpoint: + description: IP and Port of discovery service URL of operator platform + type: string + mcc: + description: Mobile country code of operator sending the request + type: string + mnc: + $ref: '#/components/schemas/PqStringArray' + name: + description: Name to uniquely identify a federation + type: string + operatorid: + description: Globally unique string to identify an operator platform + type: string + region: + description: Region to which this federator is associated with + type: string + revision: + description: Revision ID to track object changes. We use jaeger traceID + for easy debugging but this can differ with what partner federator uses + readOnly: true + type: string + selffederationid: + description: Self federation ID + type: string + selfoperatorid: + description: Self operator ID + type: string + type: object + OrmapiFederator: + properties: + apikey: + description: API Key used for authentication (stored in secure storage) + type: string + countrycode: + description: ISO 3166-1 Alpha-2 code for the country where operator platform + is located + type: string + federationaddr: + description: Federation access point address + type: string + federationid: + description: Globally unique string used to indentify a federation with + partner federation + type: string + locatorendpoint: + description: IP and Port of discovery service URL of operator platform + type: string + mcc: + description: Mobile country code of operator sending the request + type: string + mnc: + $ref: '#/components/schemas/PqStringArray' + operatorid: + description: Globally unique string to identify an operator platform + type: string + region: + description: Region to which this federator is associated with + type: string + revision: + description: Revision ID to track object changes. We use jaeger traceID + for easy debugging but this can differ with what partner federator uses + readOnly: true + type: string + type: object + OrmapiFederatorZone: + properties: + city: + description: Comma seperated list of cities under this zone + type: string + cloudlets: + $ref: '#/components/schemas/PqStringArray' + countrycode: + description: ISO 3166-1 Alpha-2 code for the country where operator platform + is located + type: string + geolocation: + description: GPS co-ordinates associated with the zone (in decimal format) + type: string + locality: + description: Type of locality eg rural, urban etc. + type: string + operatorid: + description: Globally unique string to identify an operator platform + type: string + region: + description: Region in which cloudlets reside + type: string + revision: + description: Revision ID to track object changes. We use jaeger traceID + for easy debugging but this can differ with what partner federator uses + readOnly: true + type: string + state: + description: Comma seperated list of states under this zone + type: string + zoneid: + description: Globally unique string used to authenticate operations over + federation interface + type: string + type: object + OrmapiGenerateReport: + properties: + EndTime: + description: Absolute time (in RFC3339 format with intended timezone) to + end report capture + format: date-time + type: string + Org: + description: Organization name + type: string + Region: + description: Region name (for internal use only) + readOnly: true + type: string + StartTime: + description: Absolute time (in RFC3339 format with intended timezone) to + start report capture + format: date-time + type: string + Timezone: + description: Timezone in which to show the reports, defaults to UTC + type: string + type: object + OrmapiInvoiceRequest: + properties: + EndDate: + description: Date filter for invoice selection, YYYY-MM-DD format + type: string + Name: + description: Billing Organization name to retrieve invoices for + type: string + StartDate: + description: Date filter for invoice selection, YYYY-MM-DD format + type: string + type: object + OrmapiMcRateLimitFlowSettings: + properties: + ApiName: + description: Name of API Path (eg. /api/v1/usercreate) + type: string + BurstSize: + description: Number of requests allowed at once + type: integer + FlowAlgorithm: + description: Flow Algorithm (TokenBucketAlgorithm or LeakyBucketAlgorithm), + valid values are one of UnknownFlowAlgorithm, TokenBucketAlgorithm, LeakyBucketAlgorithm, + or 0, 1, 2 + type: string + FlowSettingsName: + description: Unique name for FlowSettings + type: string + RateLimitTarget: + description: RateLimitTarget (AllRequests, PerIp, or PerUser), valid values + are one of UnknownTarget, AllRequests, PerIp, PerUser, or 0, 1, 2, 3 + type: string + ReqsPerSecond: + description: Number of requests per second + type: number + type: object + OrmapiMcRateLimitMaxReqsSettings: + properties: + ApiName: + description: Name of API Path (eg. /api/v1/usercreate) + type: string + Interval: + description: Time interval + type: string + MaxReqsAlgorithm: + description: MaxReqs Algorithm (FixedWindowAlgorithm), valid values are + one of UnknownMaxReqsAlgorithm, FixedWindowAlgorithm, or 0, 1 + type: string + MaxReqsSettingsName: + description: Unique name for MaxReqsSettings + type: string + MaxRequests: + description: Maximum number of requests for the specified interval + type: integer + RateLimitTarget: + description: RateLimitTarget (AllRequests, PerIp, or PerUser), valid values + are one of UnknownTarget, AllRequests, PerIp, PerUser, or 0, 1, 2, 3 + type: string + type: object + OrmapiMcRateLimitSettings: + properties: + ApiName: + description: Name of API Path (eg. /api/v1/usercreate) + type: string + FlowSettings: + additionalProperties: + $ref: '#/components/schemas/EdgeprotoFlowSettings' + description: Map of Flow Settings name to FlowSettings + nullable: true + type: object + MaxReqsSettings: + additionalProperties: + $ref: '#/components/schemas/EdgeprotoMaxReqsSettings' + description: Map of MaxReqs Settings name to MaxReqsSettings + nullable: true + type: object + RateLimitTarget: + description: RateLimitTarget (AllRequests, PerIp, or PerUser), valid values + are one of UnknownTarget, AllRequests, PerIp, PerUser, or 0, 1, 2, 3 + type: string + type: object + OrmapiMetricData: + properties: + Series: + description: Series data + items: + $ref: '#/components/schemas/OrmapiMetricSeries' + nullable: true + type: array + type: object + OrmapiMetricSeries: + properties: + columns: + description: Column names + items: + type: string + nullable: true + type: array + name: + description: Series name + type: string + tags: + additionalProperties: + type: string + description: Tags + nullable: true + type: object + values: + description: 2D Array of column values by time + items: + items: {} + type: array + nullable: true + type: array + type: object + OrmapiNewPassword: + properties: + currentpassword: + description: User's current password + type: string + password: + description: User's new password + type: string + type: object + OrmapiOrgCloudlet: + properties: + org: + description: Org that has permissions for cloudlets + type: string + region: + description: Region name + type: string + type: object + OrmapiOrgCloudletPool: + properties: + CloudletPool: + description: Operator's CloudletPool name + type: string + CloudletPoolOrg: + description: Operator's Organization + type: string + Decision: + description: Decision is to either accept or reject an invitation + type: string + Org: + description: Developer Organization + type: string + Region: + description: Region + type: string + Type: + description: Type is an internal-only field which is either invitation or + response + type: string + type: object + OrmapiOrganization: + properties: + Address: + description: Organization address + type: string + CreatedAt: + description: Time created + format: date-time + readOnly: true + type: string + DeleteInProgress: + description: Delete of this organization is in progress + readOnly: true + type: boolean + EdgeboxOnly: + description: Edgebox only operator organization + readOnly: true + type: boolean + Name: + description: Organization name. Can only contain letters, digits, underscore, + period, hyphen. It cannot have leading or trailing spaces or period. It + cannot start with hyphen + type: string + Parent: + description: This organization's parent organization for billing, if any + readOnly: true + type: string + Phone: + description: Organization phone number + type: string + PublicImages: + description: Images are made available to other organization + readOnly: true + type: boolean + Type: + description: 'Organization type: "developer" or "operator"' + type: string + UpdatedAt: + description: Time last updated + format: date-time + readOnly: true + type: string + type: object + OrmapiPasswordReset: + properties: + password: + description: User's new password + type: string + token: + description: Authentication token + type: string + type: object + OrmapiPaymentProfileDeletion: + properties: + Id: + description: Payment Profile Id + type: integer + Org: + description: Billing Organization Name associated with the payment profile + type: string + type: object + OrmapiRegionAlert: + properties: + Alert: + $ref: '#/components/schemas/EdgeprotoAlert' + Region: + description: Region name + type: string + type: object + OrmapiRegionAlertPolicy: + properties: + AlertPolicy: + $ref: '#/components/schemas/EdgeprotoAlertPolicy' + Region: + description: Region name + type: string + type: object + OrmapiRegionApp: + properties: + App: + $ref: '#/components/schemas/EdgeprotoApp' + Region: + description: Region name + type: string + type: object + OrmapiRegionAppAlertPolicy: + properties: + AppAlertPolicy: + $ref: '#/components/schemas/EdgeprotoAppAlertPolicy' + Region: + description: Region name + type: string + type: object + OrmapiRegionAppAutoProvPolicy: + properties: + AppAutoProvPolicy: + $ref: '#/components/schemas/EdgeprotoAppAutoProvPolicy' + Region: + description: Region name + type: string + type: object + OrmapiRegionAppInst: + properties: + AppInst: + $ref: '#/components/schemas/EdgeprotoAppInst' + Region: + description: Region name + type: string + type: object + OrmapiRegionAppInstClientKey: + properties: + AppInstClientKey: + $ref: '#/components/schemas/EdgeprotoAppInstClientKey' + Region: + description: Region name + type: string + type: object + OrmapiRegionAppInstEvents: + properties: + AppInst: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + Limit: + description: Display the last X metrics + type: integer + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionAppInstKey: + properties: + AppInstKey: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + Region: + description: Region name + type: string + type: object + OrmapiRegionAppInstLatency: + properties: + AppInstLatency: + $ref: '#/components/schemas/EdgeprotoAppInstLatency' + Region: + description: Region name + type: string + type: object + OrmapiRegionAppInstMetrics: + properties: + AppInst: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + AppInsts: + description: Application instances to filter for metrics + items: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + type: array + Limit: + description: Display the last X metrics + type: integer + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + Selector: + description: 'Comma separated list of metrics to view. Available metrics: + utilization, network, ipusage' + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionAppInstRefs: + properties: + AppInstRefs: + $ref: '#/components/schemas/EdgeprotoAppInstRefs' + Region: + description: Region name + type: string + type: object + OrmapiRegionAppInstUsage: + properties: + AppInst: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + EndTime: + description: Time up to which to display stats + format: date-time + type: string + Region: + description: Region name + type: string + StartTime: + description: Time to start displaying stats from + format: date-time + type: string + VmOnly: + description: Show only VM-based apps + type: boolean + type: object + OrmapiRegionAutoProvPolicy: + properties: + AutoProvPolicy: + $ref: '#/components/schemas/EdgeprotoAutoProvPolicy' + Region: + description: Region name + type: string + type: object + OrmapiRegionAutoProvPolicyCloudlet: + properties: + AutoProvPolicyCloudlet: + $ref: '#/components/schemas/EdgeprotoAutoProvPolicyCloudlet' + Region: + description: Region name + type: string + type: object + OrmapiRegionAutoScalePolicy: + properties: + AutoScalePolicy: + $ref: '#/components/schemas/EdgeprotoAutoScalePolicy' + Region: + description: Region name + type: string + type: object + OrmapiRegionClientApiUsageMetrics: + properties: + AppInst: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + DmeCloudlet: + description: Cloudlet name where DME is running + type: string + DmeCloudletOrg: + description: Operator organization where DME is running + type: string + Limit: + description: Display the last X metrics + type: integer + Method: + description: 'API call method, one of: FindCloudlet, PlatformFindCloudlet, + RegisterClient, VerifyLocation' + type: string + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + Selector: + description: 'Comma separated list of metrics to view. Available metrics: + utilization, network, ipusage' + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionClientAppUsageMetrics: + properties: + AppInst: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + DataNetworkType: + description: 'Data network type used by client device. Can be used for selectors: + latency' + type: string + DeviceCarrier: + description: 'Device carrier. Can be used for selectors: latency, deviceinfo' + type: string + DeviceModel: + description: 'Device model. Can be used for selectors: deviceinfo' + type: string + DeviceOs: + description: 'Device operating system. Can be used for selectors: deviceinfo' + type: string + Limit: + description: Display the last X metrics + type: integer + LocationTile: + description: 'Provides the range of GPS coordinates for the location tile/square. + Format is: ''LocationUnderLongitude,LocationUnderLatitude_LocationOverLongitude,LocationOverLatitude_LocationTileLength''. + LocationUnder are the GPS coordinates of the corner closest to (0,0) of + the location tile. LocationOver are the GPS coordinates of the corner + farthest from (0,0) of the location tile. LocationTileLength is the length + (in kilometers) of one side of the location tile square' + type: string + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + Selector: + description: 'Comma separated list of metrics to view. Available metrics: + utilization, network, ipusage' + type: string + SignalStrength: + description: Signal strength + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionClientCloudletUsageMetrics: + properties: + Cloudlet: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + DataNetworkType: + description: 'Data network type used by client device. Can be used for selectors: + latency' + type: string + DeviceCarrier: + description: 'Device carrier. Can be used for selectors: latency, deviceinfo' + type: string + DeviceModel: + description: 'Device model. Can be used for selectors: deviceinfo' + type: string + DeviceOs: + description: 'Device operating system. Can be used for selectors: deviceinfo' + type: string + Limit: + description: Display the last X metrics + type: integer + LocationTile: + description: 'Provides the range of GPS coordinates for the location tile/square. + Format is: ''LocationUnderLongitude,LocationUnderLatitude_LocationOverLongitude,LocationOverLatitude_LocationTileLength''. + LocationUnder are the GPS coordinates of the corner closest to (0,0) of + the location tile. LocationOver are the GPS coordinates of the corner + farthest from (0,0) of the location tile. LocationTileLength is the length + (in kilometers) of one side of the location tile square' + type: string + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + Selector: + description: 'Comma separated list of metrics to view. Available metrics: + utilization, network, ipusage' + type: string + SignalStrength: + description: Signal strength + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionCloudlet: + properties: + Cloudlet: + $ref: '#/components/schemas/EdgeprotoCloudlet' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletAllianceOrg: + properties: + CloudletAllianceOrg: + $ref: '#/components/schemas/EdgeprotoCloudletAllianceOrg' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletEvents: + properties: + Cloudlet: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + Limit: + description: Display the last X metrics + type: integer + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionCloudletInfo: + properties: + CloudletInfo: + $ref: '#/components/schemas/EdgeprotoCloudletInfo' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletKey: + properties: + CloudletKey: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletMetrics: + properties: + Cloudlet: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + Cloudlets: + description: Cloudlet keys for metrics + items: + $ref: '#/components/schemas/EdgeprotoCloudletKey' + type: array + Limit: + description: Display the last X metrics + type: integer + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + Selector: + description: 'Comma separated list of metrics to view. Available metrics: + utilization, network, ipusage' + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionCloudletPool: + properties: + CloudletPool: + $ref: '#/components/schemas/EdgeprotoCloudletPool' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletPoolMember: + properties: + CloudletPoolMember: + $ref: '#/components/schemas/EdgeprotoCloudletPoolMember' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletPoolUsage: + properties: + CloudletPool: + $ref: '#/components/schemas/EdgeprotoCloudletPoolKey' + EndTime: + description: Time up to which to display stats + format: date-time + type: string + Region: + description: Region name + type: string + ShowVmAppsOnly: + description: Show only VM-based apps + type: boolean + StartTime: + description: Time to start displaying stats from + format: date-time + type: string + type: object + OrmapiRegionCloudletProps: + properties: + CloudletProps: + $ref: '#/components/schemas/EdgeprotoCloudletProps' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletRefs: + properties: + CloudletRefs: + $ref: '#/components/schemas/EdgeprotoCloudletRefs' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletResMap: + properties: + CloudletResMap: + $ref: '#/components/schemas/EdgeprotoCloudletResMap' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletResourceQuotaProps: + properties: + CloudletResourceQuotaProps: + $ref: '#/components/schemas/EdgeprotoCloudletResourceQuotaProps' + Region: + description: Region name + type: string + type: object + OrmapiRegionCloudletResourceUsage: + properties: + CloudletResourceUsage: + $ref: '#/components/schemas/EdgeprotoCloudletResourceUsage' + Region: + description: Region name + type: string + type: object + OrmapiRegionClusterInst: + properties: + ClusterInst: + $ref: '#/components/schemas/EdgeprotoClusterInst' + Region: + description: Region name + type: string + type: object + OrmapiRegionClusterInstEvents: + properties: + ClusterInst: + $ref: '#/components/schemas/EdgeprotoClusterInstKey' + Limit: + description: Display the last X metrics + type: integer + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionClusterInstKey: + properties: + ClusterInstKey: + $ref: '#/components/schemas/EdgeprotoClusterInstKey' + Region: + description: Region name + type: string + type: object + OrmapiRegionClusterInstMetrics: + properties: + ClusterInst: + $ref: '#/components/schemas/EdgeprotoClusterInstKey' + ClusterInsts: + description: Cluster instance keys for metrics + items: + $ref: '#/components/schemas/EdgeprotoClusterInstKey' + type: array + Limit: + description: Display the last X metrics + type: integer + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Region: + description: Region name + type: string + Selector: + description: 'Comma separated list of metrics to view. Available metrics: + utilization, network, ipusage' + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionClusterInstUsage: + properties: + ClusterInst: + $ref: '#/components/schemas/EdgeprotoClusterInstKey' + EndTime: + description: Time up to which to display stats + format: date-time + type: string + Region: + description: Region name + type: string + StartTime: + description: Time to start displaying stats from + format: date-time + type: string + type: object + OrmapiRegionClusterRefs: + properties: + ClusterRefs: + $ref: '#/components/schemas/EdgeprotoClusterRefs' + Region: + description: Region name + type: string + type: object + OrmapiRegionCustomAppMetrics: + properties: + AggrFunction: + description: Aggregation function (optional) + type: string + AppInst: + $ref: '#/components/schemas/EdgeprotoAppInstKey' + Limit: + description: Display the last X metrics + type: integer + Measurement: + description: 'Pre-built queries, one of: connections' + type: string + NumSamples: + description: Display X samples spaced out evenly over start and end times + type: integer + Port: + description: Port on AppInst (optional) + type: string + Region: + description: Region name + type: string + endage: + description: End age relative to now of the time range + type: string + endtime: + description: End time of the time range + format: date-time + type: string + startage: + description: Start age relative to now of the time range + type: string + starttime: + description: Start time of the time range + format: date-time + type: string + type: object + OrmapiRegionDebugRequest: + properties: + DebugRequest: + $ref: '#/components/schemas/EdgeprotoDebugRequest' + Region: + description: Region name + type: string + type: object + OrmapiRegionDeploymentCloudletRequest: + properties: + DeploymentCloudletRequest: + $ref: '#/components/schemas/EdgeprotoDeploymentCloudletRequest' + Region: + description: Region name + type: string + type: object + OrmapiRegionDevice: + properties: + Device: + $ref: '#/components/schemas/EdgeprotoDevice' + Region: + description: Region name + type: string + type: object + OrmapiRegionDeviceReport: + properties: + DeviceReport: + $ref: '#/components/schemas/EdgeprotoDeviceReport' + Region: + description: Region name + type: string + type: object + OrmapiRegionExecRequest: + properties: + ExecRequest: + $ref: '#/components/schemas/EdgeprotoExecRequest' + Region: + description: Region name + type: string + type: object + OrmapiRegionFlavor: + properties: + Flavor: + $ref: '#/components/schemas/EdgeprotoFlavor' + Region: + description: Region name + type: string + type: object + OrmapiRegionFlavorMatch: + properties: + FlavorMatch: + $ref: '#/components/schemas/EdgeprotoFlavorMatch' + Region: + description: Region name + type: string + type: object + OrmapiRegionFlowRateLimitSettings: + properties: + FlowRateLimitSettings: + $ref: '#/components/schemas/EdgeprotoFlowRateLimitSettings' + Region: + description: Region name + type: string + type: object + OrmapiRegionGPUDriver: + properties: + GPUDriver: + $ref: '#/components/schemas/EdgeprotoGPUDriver' + Region: + description: Region name + type: string + type: object + OrmapiRegionGPUDriverBuildMember: + properties: + GPUDriverBuildMember: + $ref: '#/components/schemas/EdgeprotoGPUDriverBuildMember' + Region: + description: Region name + type: string + type: object + OrmapiRegionGPUDriverKey: + properties: + GPUDriverKey: + $ref: '#/components/schemas/EdgeprotoGPUDriverKey' + Region: + description: Region name + type: string + type: object + OrmapiRegionIdleReservableClusterInsts: + properties: + IdleReservableClusterInsts: + $ref: '#/components/schemas/EdgeprotoIdleReservableClusterInsts' + Region: + description: Region name + type: string + type: object + OrmapiRegionMaxReqsRateLimitSettings: + properties: + MaxReqsRateLimitSettings: + $ref: '#/components/schemas/EdgeprotoMaxReqsRateLimitSettings' + Region: + description: Region name + type: string + type: object + OrmapiRegionNetwork: + properties: + Network: + $ref: '#/components/schemas/EdgeprotoNetwork' + Region: + description: Region name + type: string + type: object + OrmapiRegionNode: + properties: + Node: + $ref: '#/components/schemas/EdgeprotoNode' + Region: + description: Region name + type: string + type: object + OrmapiRegionOperatorCode: + properties: + OperatorCode: + $ref: '#/components/schemas/EdgeprotoOperatorCode' + Region: + description: Region name + type: string + type: object + OrmapiRegionRateLimitSettings: + properties: + RateLimitSettings: + $ref: '#/components/schemas/EdgeprotoRateLimitSettings' + Region: + description: Region name + type: string + type: object + OrmapiRegionResTagTable: + properties: + Region: + description: Region name + type: string + ResTagTable: + $ref: '#/components/schemas/EdgeprotoResTagTable' + type: object + OrmapiRegionResTagTableKey: + properties: + Region: + description: Region name + type: string + ResTagTableKey: + $ref: '#/components/schemas/EdgeprotoResTagTableKey' + type: object + OrmapiRegionSettings: + properties: + Region: + description: Region name + type: string + Settings: + $ref: '#/components/schemas/EdgeprotoSettings' + type: object + OrmapiRegionTrustPolicy: + properties: + Region: + description: Region name + type: string + TrustPolicy: + $ref: '#/components/schemas/EdgeprotoTrustPolicy' + type: object + OrmapiRegionTrustPolicyException: + properties: + Region: + description: Region name + type: string + TrustPolicyException: + $ref: '#/components/schemas/EdgeprotoTrustPolicyException' + type: object + OrmapiRegionVMPool: + properties: + Region: + description: Region name + type: string + VMPool: + $ref: '#/components/schemas/EdgeprotoVMPool' + type: object + OrmapiRegionVMPoolMember: + properties: + Region: + description: Region name + type: string + VMPoolMember: + $ref: '#/components/schemas/EdgeprotoVMPoolMember' + type: object + OrmapiReporter: + properties: + Email: + description: Email to send generated reports + type: string + Name: + description: Reporter name. Can only contain letters, digits, period, hyphen. + It cannot have leading or trailing spaces or period. It cannot start with + hyphen + type: string + NextScheduleDate: + description: Date when the next report is scheduled to be generated (for + internal use only) + readOnly: true + type: string + Org: + description: Organization name + type: string + Schedule: + description: Indicates how often a report should be generated, one of EveryWeek, + Every15Days, EveryMonth, valid values are one of EveryWeek, Every15Days, + EveryMonth, or 0, 1, 3 + type: string + StartScheduleDate: + description: 'Start date (in RFC3339 format with intended timezone) when + the report is scheduled to be generated (Default: today)' + type: string + Status: + description: Last report status + readOnly: true + type: string + Timezone: + description: Timezone in which to show the reports, defaults to UTC + type: string + Username: + description: User name (for internal use only) + readOnly: true + type: string + type: object + OrmapiResult: + properties: + code: + description: Error code + type: integer + message: + description: Informational message + type: string + type: object + OrmapiRole: + properties: + org: + description: Organization name + type: string + role: + description: Role which defines the set of permissions + type: string + username: + description: User name + type: string + type: object + OrmapiRolePerm: + properties: + action: + description: Action defines what type of action can be performed on a resource + type: string + resource: + description: Resource defines a resource to act upon + type: string + role: + description: Role defines a collection of permissions, which are resource-action + pairs + type: string + type: object + OrmapiShowUser: + properties: + CreatedAt: + description: Time created + format: date-time + readOnly: true + type: string + Email: + description: User email + type: string + EmailVerified: + description: Email address has been verified + readOnly: true + type: boolean + EnableTOTP: + description: Enable or disable temporary one-time passwords for the account + type: boolean + FailedLogins: + description: Number of failed login attempts since last successful login + type: integer + FamilyName: + description: Family Name + type: string + GivenName: + description: Given Name + type: string + LastFailedLogin: + description: Last failed login time + format: date-time + readOnly: true + type: string + LastLogin: + description: Last successful login time + format: date-time + readOnly: true + type: string + Locked: + description: Account is locked + readOnly: true + type: boolean + Metadata: + description: Metadata + type: string + Name: + description: User name. Can only contain letters, digits, underscore, period, + hyphen. It cannot have leading or trailing spaces or period. It cannot + start with hyphen + type: string + Nickname: + description: Nick Name + type: string + PassCrackTimeSec: + description: Password strength in terms of brute-force cracking time + readOnly: true + type: number + Picture: + description: Picture (currently not used) + type: string + UpdatedAt: + description: Time last updated + format: date-time + readOnly: true + type: string + org: + description: Organization name + type: string + role: + description: Role name + type: string + type: object + OrmapiToken: + properties: + token: + description: Authentication token + type: string + type: object + OrmapiUser: + properties: + CreatedAt: + description: Time created + format: date-time + readOnly: true + type: string + Email: + description: User email + type: string + EmailVerified: + description: Email address has been verified + readOnly: true + type: boolean + EnableTOTP: + description: Enable or disable temporary one-time passwords for the account + type: boolean + FailedLogins: + description: Number of failed login attempts since last successful login + type: integer + FamilyName: + description: Family Name + type: string + GivenName: + description: Given Name + type: string + LastFailedLogin: + description: Last failed login time + format: date-time + readOnly: true + type: string + LastLogin: + description: Last successful login time + format: date-time + readOnly: true + type: string + Locked: + description: Account is locked + readOnly: true + type: boolean + Metadata: + description: Metadata + type: string + Name: + description: User name. Can only contain letters, digits, underscore, period, + hyphen. It cannot have leading or trailing spaces or period. It cannot + start with hyphen + type: string + Nickname: + description: Nick Name + type: string + PassCrackTimeSec: + description: Password strength in terms of brute-force cracking time + readOnly: true + type: number + Picture: + description: Picture (currently not used) + type: string + UpdatedAt: + description: Time last updated + format: date-time + readOnly: true + type: string + type: object + OrmapiUserLogin: + properties: + apikey: + description: API key if logging in using API key + type: string + apikeyid: + description: API key ID if logging in using API key + type: string + password: + description: User's password + type: string + totp: + description: Temporary one-time password if 2-factor authentication is enabled + type: string + username: + description: User's name or email address + type: string + type: object + OrmapiUserResponse: + properties: + Message: + description: Message + type: string + TOTPQRImage: + description: TOTP QR image + items: + minimum: 0 + type: integer + nullable: true + type: array + TOTPSharedKey: + description: TOTP shared key + type: string + type: object + OrmapiVersion: + properties: + buildauthor: + description: Build author + type: string + buildhead: + description: Head build version + type: string + buildmaster: + description: Master build version + type: string + hostname: + description: Hostname that performed build + type: string + type: object + PqStringArray: + items: + type: string + nullable: true + type: array + TypesTimestamp: + properties: + nanos: + description: Non-negative fractions of a second at nanosecond resolution. + Negative second values with fractions must still have non-negative nanos + values that count forward in time. Must be from 0 to 999,999,999 inclusive. + type: integer + seconds: + description: Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. + Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive. + type: integer + type: object + securitySchemes: + bearerAuth: + bearerFormat: JWT + description: JWT token generated by the login API to be included in the http + header + scheme: bearer + type: http +x-tagGroups: +- name: Auth & User Management API + tags: + - Security + - User + - Role + - Org +- name: Operator API + tags: + - Cloudlet + - OperatorCode + - Flavor + - CloudletProps + - CloudletResMap + - FlavorMatch + - CloudletPool + - CloudletPoolMember + - VMPool + - VMPoolMember + - OperatorMetrics + - Events + - OperatorUsage + - AlertReceiver + - Network +- name: Developer API + tags: + - ClusterInst + - App + - AppInst + - AutoProvPolicy + - AppAutoProvPolicy + - AutoScalePolicy + - PrivacyPolicy + - AutoProvPolicyCloudlet + - AppInstClientKey + - ExecRequest + - DeveloperMetrics + - Events + - DeveloperUsage + - AlertReceiver diff --git a/code/API_definitions/session.yaml b/documentation/SupportingDocuments/API proposals/Workload Orchestration/session.yaml similarity index 100% rename from code/API_definitions/session.yaml rename to documentation/SupportingDocuments/API proposals/Workload Orchestration/session.yaml diff --git a/documentation/SupportingDocuments/API_Documentation/.DS_Store b/documentation/SupportingDocuments/API_Documentation/.DS_Store new file mode 100644 index 00000000..a4265044 Binary files /dev/null and b/documentation/SupportingDocuments/API_Documentation/.DS_Store differ diff --git a/documentation/API_Documentation/.unotes/unotes_meta.json b/documentation/SupportingDocuments/API_Documentation/.unotes/unotes_meta.json similarity index 100% rename from documentation/API_Documentation/.unotes/unotes_meta.json rename to documentation/SupportingDocuments/API_Documentation/.unotes/unotes_meta.json diff --git a/documentation/SupportingDocuments/API_Documentation/EdgeCloud_LcM_Documentation_Obsolete.md b/documentation/SupportingDocuments/API_Documentation/EdgeCloud_LcM_Documentation_Obsolete.md new file mode 100644 index 00000000..f96c1b33 --- /dev/null +++ b/documentation/SupportingDocuments/API_Documentation/EdgeCloud_LcM_Documentation_Obsolete.md @@ -0,0 +1,473 @@ + + + +# Edge Cloud API +## Overview + +The reference scenario foresees a distributed Telco Edge Cloud where any Application Delevoper, known as an Application Provider, can host and deploy their application according to their specifications and operational criteria (e.g. within an specific geographical zone for data protection purposes, ensure a minimum QoS for the application clients, etc). Through Telco Edge Cloud services Developers around the globe can be benefit from the traditional Cloud strengths but expertise and advantages of the Mobile Network Operators offering to their users an evolved experience for XR, V2X, Holographic and other new services. + +## 1. Introduction +The Edge Cloud LcM API provides capabilities for lifecycle management of application instances and edge discovery. + +Lifecycle Management allows Application Provider to onboard their application details to the Operator Platform which do bookkeeping, resource validation and other pre-deployment operations. Application details can contain components network specification , package type (QCOW2, OVA, CONTAINER, HELM), operating system details and respository to download the image of the desired application. + +Once the application is available on the Operator Platform, the Application Provider can instantiate the application. OP helps AP to decide where to instantiate the applications allowing them to retrieve a list of Edge Zones that meets the provided criteria. This discovery can be filtered by an specific geographical region (e.g when data residency is need) and by status (active, inactive, unknown). + +Application Provider can ask the operator to instantiate the application to one or several Edge Zones that meet the criteria. Typically when more than one Edge Zone is required in the same geographic boundary, AP can define instead the entire Region. AP can retrieve the information of the instances for a given application, the information could be the Edge Zone where the instance is, status (ready, instantiating, failed, terminating, unknown) and endpoint (ip, port, fqdn). + +Application Provider can terminate an instance of an application (appInstanceId) or all the instances for a given appId. + +## 2. Quick Start + +The usage of the Edge Cloud LcM is based on several resources including GSMA Operator Platform, Public Cloud and SDOs, to define a first approach on the lifecycle management of application instances and edge discovery. + +Before starting to use the API, the developer needs to know about the below specified details. + +Two operations have been defined in Edge Cloud LcM API. + +**Application** - The Application Provider submit application metadata to the Operator Platform. The OP generate an appId for that metadata that will be used to instantiate the application within the Edge Cloud Zone. + +**Edge Cloud** - Retrieves all the Edge Cloud Zones available according to some defined parameters where an application can be instantiated. + + +# Introduction + +**Application** +The Application Provider submit application metadata to the Operator Platform. + +**Application Instance** +An Operator Platform instantiate an Application on an Edge Cloud Node when the Application Provider resquest it. + +**Edge Cloud information** +Retrieves all the Edge nodes available according to some defined parameters. + +# Relevant terms and definitions +This section provides definitions of terminologies commonly referred to throughout the API descriptions. + +**Application Provider** +The provider of the application that accesses an OP to deploy its application on the Edge Cloud. An Application Provider may be part of a larger organisation, like an enterprise, enterprise customer of an OP, or be an independent entity. + +**Application** +Contains the information about the application to be instantiated. Descriptor, binary image, charts or any other package assosiated with the application. The Application Provider request contains mandatory criteria (e.g. required CPU, memory,storage, bandwidth) defined in an Application. + +**Edge Cloud** +Cloud-like capabilities located at the network edge including, from the Application Provider's perspective, access to elastically allocated compute, data storage and network resources. + +**Edge Cloud Zone** +An Edge Cloud Zone is the lowest level of abstraction exposed to an Application Provider who wants to deploy an Application on Edge Cloud. Zones exist within a Region. + + +**OP** +Operator Platform. An Operator Platform (facilitates access to the Edge Cloud and other capabilities of an Operator or federation of Operators and Partners. ^[1] + +**Region** +An OP Region is equivalent to a Region on a public cloud. The higher construct in the hierarchy exposed to an Application Provider who wishes to deploy an Application on the Edge Cloud and broadly represents a geography. A Region typically contains one or multiple Zones. A Region exists within an Edge Cloud. + +### Application Management + +**submitApp** +Submits an application details to an OP. Based on the details provided, OP shall do bookkeeping, resource validation and other pre-deployment operations. + +**deleteApp** +Removes an application from an OP, if there is a running instance of the given application, the request cannot be done. + +**getApp** +Retrieves the information of a given application. + +### Application Instance Management + +**appInstantiation** +Request the OP to instatiate an instance of an application in a given Edge Cloud Zone, if this parameter is not set, the OP will instantiate the applications in all the Edge Cloud Zones available. + +**getAppInstance** +Retrieves the list with information of the instances related to a given application. + +**deleteAppInstance** +Removes a given application instance from an Edge Cloud Zone. + +### Edge Cloud information + +**getEdgeCloudZones** +List of the operator’s Edge Cloud Zones and their status, ordering the results by location and filtering by status (active/inactive/unknown). + +## Further info and support + +(FAQs will be added in a later version of the documentation) + +## 3. Authentication and Authorization +TBD + +## 4. API Documentation +## 4.1 API Version + +0.9.2 + + +**License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) + +[Product documentation at Camara](https://github.com/camaraproject/) +### + +## 4.2 Details + +#### POST /app +##### Summary + +Submit application metadata to the Operator Platform. + +##### Description + +The Application Provider request contains in the body an Aplication Manifest see AppManifest in model section. + +##### Responses + +If the request is correct a 201 code will be obtained along with an appId to be used in other methods to obtain information or to generate app instances. + +| Code | Description | +| ---- | ----------- | +| 201 | Application created successfully | +| 400 | Bad request | +| 401 | Unauthorized | +| 403 | Forbidden | +| 409 | Conflict | +| 500 | An unknow error has occurred | +| 501 | Not Implemented +| 503 | Service unavailable | + + +##### GET /app/{appId}/ +##### Summary + +Ask the OP the information for a given application. + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| appId| path | A globally unique identifier associated with the application. OP generates this identifier when the application is submitted over NBI | yes | string | + +##### Responses + +If the request is correct a 200 code will be obtained along with an Aplication Manifest see AppManifest in model section. + +| Code | Description | +| ---- | ----------- | +| 200 | OK | +| 401 | Unauthorized | +| 403 | Forbidden | +| 404 | The specified resource was not found | +| 500 | An unknow error has occurred | +| 503 | Service unavailable | + + +##### DELETE /app/{appId}/ +##### Summary + +Delete all the information and content related to an Application + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| appId | path | Identificator of the application to be deleted provided by the OP NBI once the submission was successful | yes | string | + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 202 | Request accepted | +| 204 | App deleted | +| 400 | Bad request | +| 401 | Unauthorized | +| 403 | Forbidden | +| 404 | Not Found | +| 409 | Conflict | +| 500 | Internal Server Error | +| 503 | Service unavailable | + +##### POST /app/{appId}/instance +##### Summary + +Ask the OP to instantiate an application to one or several Edge Cloud Zones with an Application as an input and an Application Instance as the output. + +##### Description + +Details regarding where the application should be instantiated + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| appId | path | A globally unique identifier associated with the application. OP generates this identifier when the application is submitted over NBI. | yes | string | + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 202 | Application instantiation accepted | +| 400 | Bad request | +| 401 | Unauthorized | +| 403 | Forbidden | +| 409 | Conflict | +| 500 | An unknow error has occurred | +| 501 | Not Implemented +| 503 | Service unavailable | + + +##### GET /app/{appId}/instance +##### Summary + +Ask the OP the information of the instances for a given application. + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| appId| path | A globally unique identifier associated with the application. OP generates this identifier when the application is submitted over NBI | yes | string | +| appInstanceId| query | A globally unique identifier associated with a running instance of an application. OP generates this identifier. | no | string | +| region| query | Human readable name of the geografical region of the Edge Cloud. Defined by the OP. | no | string | + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 200 | Information of Aplication Instances | +| 401 | Unauthorized | +| 403 | Forbidden | +| 404 | The specified resource was not found | +| 500 | An unknow error has occurred | +| 503 | Service unavailable | + + +##### DELETE /app/{appId}/instance +##### Summary + +Terminate a running instance of an application within an Edge Cloud Zone + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| appId | path | Identificator of the application to be deleted provided by the OP NBI once the submission was successful | yes | string | +| appInstanceId | query | Identificator of the specific application instance that will be terminated | no | string | + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 202 | Request accepted to be processed. It applies for async deletion process | +| 204 | App deleted | +| 400 | Bad request | +| 401 | Unauthorized | +| 403 | Forbidden | +| 404 | Not Found | +| 500 | Internal Server Error | +| 503 | Service unavailable | + + + +#### GET /edge-cloud-zones +##### Summary + +Retrieve a list of the operator’s Edge Cloud Zones and their status + +##### Description +List of the operator’s Edge Cloud Zones and their status, ordering the results by location and filtering by status (active/inactive/unknown). + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| region | query | Human readable name of the geografical region of the Edge Cloud. Defined by the OP. | no | string | +| status | query | _Available values_ : active, inactive, unknown Default value : unknown | no | string | + + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 200 | Available Edge Cloud Zones | +| 401 | Unauthorized | +| 403 | Unauthorized | +| 404 | Not Found | +| 500 | Internal Server Error | +| 503 | Service unavailable | + + +### Models + +#### AppId + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| appId | string | A globally unique identifier associated with the application. OP generates this identifier when the application is submitted over NBI. | yes | + +#### AppInstanceId + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| appInstanceId | string | A globally unique identifier associated with a running instance of an application. OP generates this identifier. | Yes | + +#### AppInstantiation + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| appInstantiation | string | Attributes with information where to instantiate a given application | yes | +| edgeCloudZone | string | Human readable name of the zone of the Edge Cloud. Defined by the OP. | no | +| region | string | Human readable name of the geografical region of the Edge Cloud. Defined by the OP. | yes | + +#### EdgeCloudZone +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| name | string | Human readable name of the zone of the Edge Cloud. Defined by the OP. | no | +| provider | integer | Human readable name of the edge cloud provider company (e.g. telco operator, hyperscaler).| no | + + +#### AppManifest + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| name | string | Name of the application. | yes | +| version | integer | Application version information| no | +| packageType | string |[ QCOW2, OVA, CONTAINER, HELM ] | no | +| operatingSystem | string | more details in the specific table| no | +| appRepo | object |more details in the specific table | yes | +| componentSpec | array | Information defined in "appRepo" point to the application descriptor e.g. Helm chart, docker-compose yaml file etc. The descriptor may contain one or more containers and their associated meta-data. A component refers to additional details about these containers to expose the instances of the containers to external client applications. App provider can define one or more components (via the associated network port) in componentSpec corresponding to the containers in helm charts or docker-compose yaml file as part of app descriptors. | yes| +version | integer | Application version information | no | + +#### OperatingSystem + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| arquitecture | string | [ x86_64, x86 ]| yes | +| family | string | [ RHEL, UBUNTU, COREOS, WINDOWS, OTHER ]| yes | +| version | string | [OS_VERSION_UBUNTU_2204_LTS, OS_VERSION_RHEL_8, OS_MS_WINDOWS_2022, OTHER]| yes | +| license | string | [OS_LICENSE_TYPE_FREE, OS_LICENSE_TYPE_ON_DEMAND, OTHER ] | yes | + +#### AppRepo + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| type | string | Application repository and image URI information. PUBLICREPO is used of public urls like github, helm repo etc. PRIVATEREPO is used for private repo managed by the application developer. Private repo can be accessed by using the app developer provided userName and password. Password is recommended to be the personal access token created by developer e.g. in Github repo. [ PRIVATEREPO, PUBLICREPO ]. | yes | +| imagePath | string | example: https://charts.bitnami.com/bitnami/helm/example-chart:0.1.0 A Uniform Resource Identifier (URI) as per RFC 3986, identifies the endpoint within an Edge Cloud Zone where the user equipment may connect to the selected application instance| yes | +| userName | string | Username to acces the Helm chart, docker-compose file or VM image repository | no | +| credentials | string | maxLength: 128 Password or personal access token created by developer to acces the app repository. API users can generate a personal access token e.g. docker clients to use them as password | no | +| authType | string | The credentials can also be formatted as a Basic auth or Bearer auth in HTTP "Authorization" header.[ DOCKER, HTTP_BASIC, HTTP_BEARER, NONE ] | no | +| checksum | string |MD5 checksum for VM and file-based images, sha256 digest for containers | no | + +#### ComponentSpec + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| componentName | string | Component name must be unique with an application | yes | +| networkInterfaces | array | Each application component exposes some ports either for external users or for inter component communication. Application provider is required to specify which ports are to be exposed and the type of traffic that will flow through these ports.The underlying platform may assign a dynamic port against the "extPort" that the application clients will use to connect with edge application instance. | yes | + +#### networkInterfaces + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| interfaceId | string | Each application component exposes some ports either for external users or for inter component communication. Application provider is required to specify which ports are to be exposed and the type of traffic that will flow through these ports.The underlying platform may assign a dynamic port against the "extPort" that the application clients will use to connect with edge application instance. | yes | +| protocol | string | Defines the IP transport communication protocol i.e., TCP, UDP or ANY | yes | +| port | integer | Port number exposed by the component. OP may generate a dynamic port towards the component instance which forwards external traffic to the component port. | yes | +| visibilityType | string | Defines whether the interface is exposed to outer world or not i.e., external, or internal.If this is set to "external", then it is exposed to external applications otherwise it is exposed internally to edge application components within edge cloud. When exposed to external world, an external dynamic port is assigned for UC traffic and mapped to the extPort | yes | + + + +#### AppInstanceInfo +Information about the application instance. + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| appInstanceId | string | A globally unique identifier associated with a running instance of an application. OP generates this identifier. | no | +| edgeCloudZone | string |Human readable name of the zone of the Edge Cloud. Defined by the OP. | no | +| status | string |Status of the application instance (default is 'unknown')[ ready, instantiating, failed, terminating, unknown ]| no | +| componentEndpointInfo | object |Information about the IP and Port exposed by the OP. Application clients shall use these access points to reach this application instance | no | + +#### ComponentEndpointInfo + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| interfaceId | string |This is the interface Identifier that app provider defines when application is onboarded. | yes | +| accessPoints | object | object | | yes | + +#### AccessPoints + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| port | integer | Port number exposed by the component. OP may generate a dynamic port towards the component instance which forwards external traffic to the component port. | yes | +| fqdn | string | | yes | +| ipv4Addr | string | IPv4 address may be specified in form
as: - address - an IPv4 number in dotted-quad form 1.2.3.4. Only this exact IP number will match the flow control rule. - address/mask - an IP number as above with a mask width of the form 1.2.3.4/24. In this case, all IP numbers from 1.2.3.0 to 1.2.3.255 will match. The bit width MUST be valid for the IP version. | | +| ipv6Addr | string | IPv6 address, following IETF 5952 format, may be specified in form
as: - address - The /128 subnet is optional for single addresses: - 2001:db8:85a3:8d3:1319:8a2e:370:7344 - 2001:db8:85a3:8d3:1319:8a2e:370:7344/128 - address/mask - an IP v6 number with a mask: - 2001:db8:85a3:8d3::0/64 - 2001:db8:85a3:8d3::/64 | | +| anyOf | string | | yes | + +#### ErrorInfo + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| status | integer | HTTP status code returned along with this error response | yes | +| code | string | Code given to this error | yes | +| message | string | Detailed error description | yes | + +#### EdgeCloudZoneDetails +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| edgeCloudZone | string | Human readable name of the zone of the Edge Cloud. Defined by the OP. | | +| status | string | Status of the Edge Cloud Zone (default is 'unknown')[ active, inactive, unknown ]| | +| region | string | Human readable name of the geografical region of the Edge Cloud. Defined by the OP. | | + +#### SubmittedApp +Information about the submitted app + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| appId | string | A globally unique identifier associated with the application. OP generates this identifier when the application is submitted over NBI. | | + +#### Uri +example: https://charts.bitnami.com/bitnami/helm/example-chart:0.1.0 + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| uri | string | A Uniform Resource Identifier (URI) as per RFC 3986, identifies the endpoint within an Edge Cloud Zone where the user equipment may connect to the selected application instance | | + +### 4.3 Errors + +Since CAMARA Edge Cloud LCM API is based on REST design principles and blueprints, well defined HTTP status codes and families specified by community are followed [[2]](#2). + +Details of HTTP based error/exception codes for Edge Cloud LCM API are described in Section 4.2 of each API REST based method. +Following table provides an overview of common error names, codes, and messages applicable to Edge Cloud LCM API. + +| No | Error Name | Error Code | Error Message | +| --- | ---------- | ---------- | ------------- | +|1 |400 | INVALID_ARGUMENT | "Client specified an invalid argument, request body or query param" | +|2 |401 | UNAUTHORIZED | "Request not authorized due to missing, invalid, or expired credentials" | +|3 |403 | FORBIDDEN | "Client does not have sufficient permissions to perform this action" | +|4 |404 | NOT FOUND | "The specified resource was not found" | +|5 |409 | CONFLICT | "Conflict with an existing resource" | +|6 |500 | INTERNAL | "Internal Server Error" | +|7 |501 | NOT_IMPLEMENTED | "Service not implemented" | +|8 |503 | UNAVAILABLE | "Service unavailable" | +|9 |504 | TIMEOUT | "Request timeout exceeded. Try later." | + +### 4.4 Policies + +N/A + +### 4.5 Code Snippets + +N/A +### 4.6 FAQ's + +(FAQs will be added in a later version of the documentation) + +### 4.7 Terms + +N/A + +### 4.8 Release Notes + +TBD + +## References + +[1] [GSMA OPG Operator Platform Requirements](https://www.gsma.com/futurenetworks/wp-content/uploads/2023/07/OPG.02-v5.0-Operator-Platform-Requirements-and-Architecture.pdf) +[2] [HTTP Status codes spec](https://restfulapi.net/http-status-codes/) diff --git a/documentation/API_Documentation/README.md b/documentation/SupportingDocuments/API_Documentation/README.md similarity index 100% rename from documentation/API_Documentation/README.md rename to documentation/SupportingDocuments/API_Documentation/README.md diff --git a/documentation/SupportingDocuments/API_Documentation/Simple_Edge_Discovery_Documentation.md b/documentation/SupportingDocuments/API_Documentation/Simple_Edge_Discovery_Documentation.md new file mode 100644 index 00000000..f6239518 --- /dev/null +++ b/documentation/SupportingDocuments/API_Documentation/Simple_Edge_Discovery_Documentation.md @@ -0,0 +1,80 @@ +# Overview +The Simple Edge Discovery API returns the name, provider and UUID of the Edge Cloud Zone closest to a given device. The API call can be made either directly from the device, or from an Internet server. In either case, the device must be currently attached (connected) to the operator network. + +# Introduction +This API provides a simple way to know which Edge Cloud Zone is closest to the customer's device. Typically this Edge Cloud Zone will support the best network performance between client and server, since propgation delay is minimised. Knowing which is the closest Edge Cloud Zone allows: +1. an application client to proceed to connect to any application server hosted on that , for which the IP address was provided when the instance was spun up using the cloud provider tools, +2. an application developer to spin up an instance of their application server on that Edge Cloud Zone, using their cloud provider tools. + +Note that the Simple Edge Discovery API offers an advantage over geolocation. Instead it calculates the shortest network path between the device and the Edge Cloud Zone, which is more accurate and takes into account internal operator network topology (which can vary greatly between networks). + +# Quick Start +1. Make a GET request to `/edge-cloud-zones?filter=closest` +2. Query the JSON response with: +* `$.[0].edgeCloudZoneId` to return the UUID for the closest Edge Cloud Zone +* `$.[0].edgeCloudZoneName` to return the cloud provider's name for the closest Edge Cloud Zone +* `$.[0].edgeCloudProvider` to return the name of the cloud provider for the closest Edge Cloud Zone + +# Authentication and/or Authorization +CAMARA guidelines defines a set of authorization flows which can grant API clients access to the API functionality, as outlined in the document [CAMARA-API-access-and-user-consent.md](https://github.com/camaraproject/IdentityAndConsentManagement/blob/main/documentation/CAMARA-API-access-and-user-consent.md). Which specific authorization flows are to be used will be determined during onboarding process, happening between the API Client and the Telco Operator exposing the API, taking into account the declared purpose for accessing the API, while also being subject to the prevailing legal framework dictated by local legislation. + +It is important to remark that in cases where personal user data is processed by the API, and users can exercise their rights through mechanisms such as opt-in and/or opt-out, the use of 3-legged access tokens becomes mandatory. This measure ensures that the API remains in strict compliance with user privacy preferences and regulatory obligations, upholding the principles of transparency and user-centric data control. + + +# Endpoint definitions +- Endpoint: `/edge-cloud-zones` +- Method accepted: GET +- Parameters: ?filter=closest* +- HTTP codes: `200 OK` +- HTTP Response body: application/json + +## Constraints +The device identified in the API request must be attached to the operator netwotk, otherwise the shortest network path from that device to each edge cloud zone cannot be calculated. + +# Errors +If the mobile subscription parameters contain a formatting error, a `400 INVALID_ARGUMENT` error is returned. + +If the authentication token is not valid, a `401 UNAUTHENTICATED` error is returned. + +If the API call requires consent and permission hasnot been obtained , a `403 PERMISSION_DENIED` error is returned. + +If the mobile subscription cannot be identified from the provided parameters, a `404 NOT_FOUND` error is returned. + +Any more general service failures will result in an error in the `5xx` range with an explanation. + +Please see the YAML documentation (link below) for a full list of errors + +# Code snippets + +`HTTP GET /edge-cloud-zones?filter=closest` + +`HTTP 200 OK application/json` + +```javascript +[ + { + "edgeCloudZoneId": "4gt555-6457-7890-d4he-1dc79f44gb66", + "edgeCloudZoneName": "example zone name", + "edgeCloudProvider": "example zone provider" + } +] + +``` + +Response processing: +`$.[0].edgeCloudZoneId` -> "4gt555-6457-7890-d4he-1dc79f44gb66" +`$.[0].edgeCloudZoneName` -> example name" +`$.[0].edgeCloudProvider` -> "example zone provider" + +# FAQs +_Can I use the device GPS to locate the closest MEC?_ +_Can I ping the various Edge Cloud Zones and calculate the closest from that?_ +The answer to both of these is 'not reliably': +- Each device has an IP 'anchor point' in the operator mobile network which may be a significant distance from the location of the device itself. It is this path - IP anchor to Edge Cloud Zone - that decides the shortest network path and hence shortest propagation delay. +- ping (both ICMP and TCP) fistly requires having deployed endpoints to ping - which may not be the case if the application server has not been deployed on more than on Edge Cloud Zone. Secondly, mobile networks are volatile, and ping results will not give an accurate picture of the static network topology. + +# Release Notes +v1.0.0 to align with 1.0.0 YAML spec, May 1st 2024 + +# API Spec +YAML available at: https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/simple_edge_discovery.yaml diff --git a/documentation/SupportingDocuments/API_Documentation/Traffic_Influence_API_Documentation_Obsolete.md b/documentation/SupportingDocuments/API_Documentation/Traffic_Influence_API_Documentation_Obsolete.md new file mode 100644 index 00000000..39294cf1 --- /dev/null +++ b/documentation/SupportingDocuments/API_Documentation/Traffic_Influence_API_Documentation_Obsolete.md @@ -0,0 +1,439 @@ + +# OPAG-CAMARA Traffic Influence API +## Overview + +NOTE: this documentation file is obsolete. The API documentation is now fully included in the API YAML file. + +The reference scenario foresees a Service, composed by one or more Service Producers deployed in different geographical locations on Edge Cloud Zones (Edge datacentres of Telco Operator) or in Cloud. The Service Producer, deployed at the Edge, is referred as Edge Application Server (EAS). +An Edge Cloud Zone is a platform in the Telco Operator network, offering network, compute and storage resources to developers. A developer can deploy and run applications on an Edge Cloud Zone, meaning reduced latency to end users that are nearby, as the network path is shorter. A network operator's EdgeCloud may comprise multiple Edge Cloud Zones, each in a discrete location to bring latency benefits to end users across a country . The operator can help developers know which of the Edge Cloud Zones will bring the best performance benefit for a given end user and application +The Traffic Influence API (TI API) provides the fastest routing from the user Device (e.g. a Smartphone) to the optimal EAS instance in a specific geographical location, installed in an Edge Cloud Zone. +If a Service is offered by Cloud Instances and by Edge Instances, the TI API can be used get the optimal routing of the traffic to the Edge Instances, maybe for a set of users. Getting the optimal routing can be used to improve latency maybe in combination with other CAMARA APIs such as QoD (Quality On Demand). Providing the optimal routing is indeed an important step to get the optimal latency. +If the TI API is used to get the best routing at the Edge for a Device in a geographical location and the Device moves to another geographical location, the TI API can be invoked to get the optimal routing in the new geographical location for that Device. + +## 1. Introduction +The TI API provides the capability to establish the best routing, in terms of latency, in a specific geographical area, between the user Device, e.g. the user’s smartphone, and the optimal EAS instance nearby. If the Device moves in a different geographical location where a more suitable EAS instance is available, the TI API can be invoked to influence the Device connectivity to get the optimal routing to the that local instance. It is important to notice that it is a task of the Application invoking the TI API to detect the changes in the Device location. +The generic architecture for the Service can foresee some Cloud instances of the Application, one or more Edge Instances of the Application. A component of the Service is the TI API Consumer. This logical component can be integrated in other components of the Service to invoke the TI API, creating a "TrafficInfluence" resource specifying the desired intent. +The TI API Producer implements the intent specified in the "TrafficInfluence" resource. +While the TI API can be invoked to activate the fastest routing for any user, it can also be used to request the best routing for a specific user. Invoking the TI API for each user, many "TrafficInfluence" resources are created for each user to provide the requested routing for a set of users. +The same approach is used for the geographical locations where the influence of the traffic must be applied. Invoking the TI API without specifying a geographical area activates the optimal routing toward any EAS instance, while invoking the TI API specifying a geographical area activates the optimal routing only toward the EAS instance located closest to that geographical area. To activate the optimal routing in selected geographical areas, the TI API must be invoked for each geographical area. +The TI API can be used to: + - optimise the routing when Devices need to consume the service provided by a local EAS Instances. + - effect an already established Device routing when the Device moves among different geographical locations. When the TI API consumer detects a Device has entered a geographical location where an EAS instance is available, it can invoke the TI API to get the optimal routing toward that EAS instance. If the Device moves to another geographical location, served by another EAS instance, the routing might not be optimal anymore for the new EAS instance. In the case the Application detects a location change, it can invoke the TI API again to request a new routing optimization toward the new EAS instance. + +## 2. Quick Start +The usage of the TI API is based on the management of a "TrafficInfluence" resource, an object containing the intent requested invoking the TI API and that is implemented by the platform configuring the Mobile Network for the optimal routing toward the EAS instance. +The "TrafficInfluence" resource can be created (providing the related parameters that specify the desired intent), queried, modified and deleted. +The TI API is asynchronous, a notification is available providing information about the status of the requested resource. +For an Application (identified by "appId") many "TrafficInfluence" resources can be created, e.g. to add multiple users, regions or zones. + +Before starting to use the TI API, the developer needs to know about the below specified details: + +**Base-Url** +The RESTful TI API endpoint, for example [**https://tim-api.developer.tim.it/trafficinfluence**](https://tim-api.developer.tim.it/trafficinfluence) + +**Authentication** +Configure security access keys such as OAuth 2.0 client credentials to be used by Client applications which will invoke the TI API. + +**TrafficInfluence** +This object represents the resource that carries the requirements from the user to be implemented. The TI API is invoked for the life cycle management of this resource (CRUD). The resource contains the intents from the TI API Consumer. Managing this resource, the developer can specify in which geographical location the routing must be applied, toward which application, maybe for a specific set of users or for a limited period of time. + +**trafficInfluenceID** +Identifier for the Traffic Influence resource. This parameter is returned by the TI API and must be used to update it (e.g., adding a Device or deleting it). A different Traffic Influence resource must be created for any Device or Zone or Region. All these resources are related to an Application identified by "appId". + +**apiConsumerId** +Unique identifier for the TI API Consumer. + +**region** +The developer can specify in which geographical area he requires the fastest routing toward the nearest application instance. A "region" is a wide geographical area and it contains one or more "zones". A "zone" is where the Edge Cloud Zone is located. Zones and Regions identifiers are defined and provided by the Telco Operator and can also be used or retrieved with other CAMARA APIs (“MEC Exposure & Experience Management API” and “Simple Edge Discovery”). To add more regions the TI API must be invoked (POST) for each region. New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Application (identified by "appId"). + +**zone** +The developer can specify in which geographical area he requires the fastest routing toward the nearest Application instance. A "zone" is a smaller geographical area inside a "region". A "zone" is where the Edge Cloud Zone is located. To add more zones the TI API must be invoked (POST) for each "zone". New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Application (identified by "appId"). + +**appId** +A globally unique identifier associated with the application. This identifier is provided during the application onboarding process. To influence the traffic toward a specific Application. It is the Operator Platform that detects the appropriate Application instance in the selected "region" or "zone". + +**appInstanceId** +A globally unique identifier generated by the Operator Platform to identify a specific instance of the Application on a specific zone. To influence a traffic toward a specific Application instance. + +**trafficFilters** +The Application can expose different service on different interfaces, with this parameter it is possible to enable just some of those services maybe for different sets of users. + +**Device** +A user Device can be provided as an input. To add more users the TI API must be invoked (POST) of each user Device. New "TrafficInfluence" resources are created (with different "trafficInfluenceID"). All the created resources are aggregated by the Application (identified by "appId"). The routing toward the selected Application instance is only applied for provided user Devices. + +**Notification URL and token** +Developers have a chance to specify call back URL on which notifications (e.g. session termination) regarding the session can be received from the service provider. This is also an optional parameter. + +## 3. Authentication and Authorization +The TI API makes use of the client credentials grant which is applicable for server to server use cases involving trusted partners or clients without any protected user data involved. +In this method the TI API invoker client is registered as a confidential client with an authorization grant type of client\\_credentials [2]. + +## 4. API Documentation +## 4.1 Details + +The TI API is consumed by an Application Function (AF) requesting for the optimal routing, in term of latency, for the traffic flow from a Device toward EAS instances in Edge Cloud Zones. +When the Application (the EAS) is onboarded and deployed in the Edge Cloud Zones, the Application is identified with a unique identifier ("appId"). +Using the application identifier ("appId") and specifying a Zone or a Region, the Telco Operator Platform, autonomously identifies the best instance of the EAS toward which routing the traffic flow and configures the Mobile Network accordingly to get the fastest routing. +If just the application identifier is used, the Telco Operator Platform identifies all the EAS Instances and activates the optimal routing on the Mobile Network. +If the optimal routing in term of latency should be available just for a set of users, the TI API must be invoked for each user creating a new TrafficInfluce resource for each one. +If the Application offers different services on different interfaces a traffic filter based on IP, Port and Protocol can be used. I this way it is also possible to redirect different users to different interfaces. +Here are some possible intents: + +1) activate the optimal routing for any EAS instance: the TI API must be invoked with the "appId". The Telco Operator Platform identifies all the EAS instances and activates the optimal routing on the Mobile Network. +2) activate the optimal routing in a specific Region or Zone: the TI API must be invoked with the "appId" and the Zones and Regions identifiers. +3) activate the optimal routing for a user devices: the TI API can be invoked with a user Device identifier (“Device”). For each user Device, a TI API invocation is required. + +## Version: 0.9.3 + +**Contact information:** +project-email@sample.com + +**License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) + +[Product documentation at Camara](https://github.com/camaraproject/) +### /traffic-influences + +#### GET +##### Summary + +Retries existing TrafficInfluence Resources + +##### Description + +Reads all of the active TrafficInfluence resources owned by the same API Consumer authenticated via oAuth2 + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| appId | query | Used to select traffic influence resources filtered by appId | No | string (uuid) | + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 200 | Returns the information about existing TrafficInfluence resources. | +| 401 | Unauthorized | +| 403 | Forbidden | +| 500 | An unknow error has occurred | +| 503 | Service unavailable | +| 504 | Connection timeout towards backend service has occurred | + +#### POST +##### Summary + +Creates a new TrafficInfluence resource + +##### Description + +Takes as input an object containing the intents from the API Consumer and creates a TrafficInfluence resourse accordingly. The trafficInfluenceID parameter, that is part of the object, must not be valorized when creating a new resource. For this reason the trafficInfluenceID parameter must be avoided in the object, anyway it will be ignored by the API Producer. It is automatically generated by the system and returned in the response. + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 201 | TrafficInfluence resource created, the related object is returned with the resource ID (trafficInfluenceID) and status (state) valorised, | +| 400 | Invalid input | +| 401 | Unauthorized | +| 403 | Forbidden | +| 500 | An unknow error has occurred | +| 503 | Service unavailable | +| 504 | Connection timeout towards backend service has occurred | + +### /traffic-influences/{trafficInfluenceID} + +#### GET +##### Summary + +Reads a specific TrafficInfluence resource identified by the trafficInfluenceID value + +##### Description + +Returns a specific TrafficInfluence resources owned by the same API Consumer authenticated via oAuth2 + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| trafficInfluenceID | path | Identifier of the specific TrafficInfluence resource to be retrieved, modified or deleted. It is the value used to fill trafficInfluenceID parameter | Yes | string | + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 200 | OK. | +| 401 | Unauthorized | +| 403 | Forbidden | +| 404 | The specified resource was not found | +| 500 | An unknow error has occurred | +| 503 | Service unavailable | +| 504 | Connection timeout towards backend service has occurred | + +#### PATCH +##### Summary + +updates a specific TrafficInfluence resource, identified by the trafficInfluenceID value + +##### Description + +The resource identified by the trafficInfluenceID value can be modified + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| trafficInfluenceID | path | Identifier of the specific TrafficInfluence resource to be retrieved, modified or deleted. It is the value used to fill trafficInfluenceID parameter | Yes | string | + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 200 | TrafficInfluence resource edited, the related object is returned, the status (state) is updated. | +| 400 | Invalid input | +| 401 | Unauthorized | +| 403 | Forbidden | +| 404 | The specified resource was not found | +| 500 | An unknow error has occurred | +| 503 | Service unavailable | +| 504 | Connection timeout towards backend service has occurred | + +#### DELETE +##### Summary + +Delete an existing TrafficInfluence resource + +##### Description + +invoked by the API Consumer to stop influencing the traffic, deleting a TrafficInfluence resource previously created + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| trafficInfluenceID | path | Identifier of the specific TrafficInfluence resource to be retrieved, modified or deleted. It is the value used to fill trafficInfluenceID parameter | Yes | string | +| callbackUrl | query | the location where updated data will be sent. Must be network accessible by the source server | No | string (uri) | + +##### Responses + +| Code | Description | +| ---- | ----------- | +| 202 | The resource delation request has been accepted | +| 401 | Unauthorized | +| 403 | Forbidden | +| 404 | The specified resource was not found | +| 503 | Service unavailable | +| 504 | Connection timeout towards backend service has occurred | + +### Models + +#### TrafficInfluence + +Resource conteining the informations to influence the traffic from the device to the EAS + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| trafficInfluenceID | string | Identifier for the Traffic Influence resource. This parameter is returned by the API and must be used to update it (e.g., adding new users or deleting it). | No | +| apiConsumerId | string | Unique Identifier of the TI API Consumer. | Yes | +| appId | string (uuid) | A globally unique identifier associated with the application. OP generates this identifier when the application is submitted over NBI.
_Example:_ `"6B29FC40-CA47-1067-B31D-00DD010662DA"` | Yes | +| appInstanceId | string (uuid) | A globally unique identifier associated with a running instance of an application. OP generates this identifier. | No | +| region | string | Unique identifier representing a region | No | +| zone | string | Unique identifier representing a zone | No | +| device | object | Device identifier | No | +| state | string | it reports the state of the TrafficInfluence resource. When first invoked, the resource is 'ordered'. When the platforms prepares the resource, it is 'created'. When the new routing is enabled in the network, the state is 'active'. If an error occurs in the resource creation or in its activation, the state is 'error'. When the DELETE method is invoked the state is 'deletion in progress'. After the resource is deleted (as a consequence of the previous invokation of the DELETE method) the state is 'deleted'.
_Enum:_ `"ordered"`, `"created"`, `"active"`, `"error"`, `"deletion in progress"`, `"deleted"` | No | +| trafficFilters | [ string ] | Identifies IP packet filters. To be used when a the Application needs a traffic flow towards a specific EAS interface | No | +| notificationUri | string | Defines the callback uri which should be notified in asynchronous way when the state for the requested resources changes (i.e. ordered to activated) | No | +| notificationAuthToken | string | Authentification token for callback API | No | + +#### PatchTrafficInfluence + +inherits from TrafficInfluence and restricts the access to certain parameters. Only some paramter can be indeed modified with the PATCH operation. + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| trafficInfluenceID | | | No | +| apiConsumerId | | | No | +| appId | | | No | +| state | | | No | + +#### PostTrafficInfluence + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| trafficInfluenceID | | | No | +| state | | | No | + +#### TrafficInfluenceNotification + +Notifican channel for changes in the TrafficInfluence resource + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| trafficInfluenceChanged | object | Resource conteining the informations to influence the traffic from the device to the EAS | Yes | + +#### TypesZoneId + +Unique identifier representing a zone + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| TypesZoneId | string | Unique identifier representing a zone | | + +#### TypesRegionId + +Unique identifier representing a region + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| TypesRegionId | string | Unique identifier representing a region | | + +#### Device + +Device identifier + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| phoneNumber | string | Subscriber number in E.164 format (starting with country code). Optionally prefixed with '+'.
_Example:_ `"123456789"` | No | +| networkAccessIdentifier | string | identifier for the End User formatted as string, it cab be the user's email address
_Example:_ `"123456789@domain.com"` | No | +| ipv4Address | string (ipv4) | IP of the device. A single IPv4 address may be specified in dotted-quad form 1.2.3.4. Only this exact IP number will match the flow control rule.
_Example:_ `"192.168.0.1"` | No | +| ipv6Address | string (ipv6) | IP of the device. A single IPv6 address, following IETF 5952 format, may be specified like 2001:db8:85a3:8d3:1319:8a2e:370:7344
_Example:_ `"2001:db8:85a3:8d3:1319:8a2e:370:7344"` | No | + +#### NetworkAccessIdentifier + +identifier for the End User formatted as string, it cab be the user's email address + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| NetworkAccessIdentifier | string | identifier for the End User formatted as string, it cab be the user's email address | | + +**Example** +
123456789@domain.com
+ +#### PhoneNumber + +Subscriber number in E.164 format (starting with country code). Optionally prefixed with '+'. + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| PhoneNumber | string | Subscriber number in E.164 format (starting with country code). Optionally prefixed with '+'. | | + +**Example** +
123456789
+ +#### Ipv4Address + +IP of the device. A single IPv4 address may be specified in dotted-quad form 1.2.3.4. Only this exact IP number will match the flow control rule. + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| Ipv4Address | string | IP of the device. A single IPv4 address may be specified in dotted-quad form 1.2.3.4. Only this exact IP number will match the flow control rule. | | + +**Example** +
192.168.0.1
+ +#### Ipv6Address + +IP of the device. A single IPv6 address, following IETF 5952 format, may be specified like 2001:db8:85a3:8d3:1319:8a2e:370:7344 + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| Ipv6Address | string | IP of the device. A single IPv6 address, following IETF 5952 format, may be specified like 2001:db8:85a3:8d3:1319:8a2e:370:7344 | | + +**Example** +
2001:db8:85a3:8d3:1319:8a2e:370:7344
+ +#### AppInstanceId + +A globally unique identifier associated with a running instance of an application. OP generates this identifier. + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| AppInstanceId | string | A globally unique identifier associated with a running instance of an application. OP generates this identifier. | | + +#### AppId + +A globally unique identifier associated with the application. OP generates this identifier when the application is submitted over NBI. + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| AppId | string | A globally unique identifier associated with the application. OP generates this identifier when the application is submitted over NBI. | | + +**Example** +
6B29FC40-CA47-1067-B31D-00DD010662DA
+ +#### ErrResponse + +Responce feedback in case of errors + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| status | string | status for the error
_Example:_ `"OK"` | No | +| message | string | additional message for the error
_Example:_ `"OK"` | No | + +#### ErrorInfo + +Information in case of errors + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| code | string | Code given to this error | Yes | +| message | string | Detailed error description | Yes | + +### 4.4 Policies + +N/A + +### 4.5 Code Snippets + +N/A +### 4.6 FAQ's + +(FAQs will be added in a later version of the documentation) + +### 4.7 Terms + +N/A + +### 4.8 Release Notes + +The Traffic Influence API reduces the complexity of the 3GPP Traffic Influence API exposed by the 3GPP Network Exposure Function (NEF) [1]. While the 3GPP TI API offers fastest routing activation and user mobility among different edge sites, this version of the CAMARA Traffic Influence API covers only the fastest routing activation, also for selected users. User mobility will be introduced in a future version. + +Enhancements with respect to the previous release: + + - These release also effects existing data sessions + - These release can be also used to optimize existing data sessions when a Device moves among geographical areas. + - The ueId parameter is renamed into Device + - The parameter Device, that identifies the User, is now simplified to guarantee the identification of an existing data session + - instanceId added +- trafficFilters description updated +- CAMEL type adopted +- FlowInfo deleted +- OpenAPI version updated to 3.0.3 +- To let the Developer to just work on parameters actually editable, the PUT method is changed into a PATCH method with a limitation on the parameters usable and modifiable. A new resource is created, PatchTrafficInfluence that contains only the editable parameters. The same approach is also adopted for the PUT method and a new resource PostTrafficInfluence was created with just the editable parameters. +- DELETE response code modified as 202. The Deletion request is accepted (not yet completed) +- Added response code 400 (bad request) to POST +- General improvement in documentation +- applicationId changed into appId and instanceId changed into appInstanceId +- alignement of parameters with EdgeCloud_LCM: applicationId changed into appId and instanceId changed into appInstanceId +- modified reference to CAMARA Authorization guidelines link +- Telco Edge Site changed in Edge Cloud Zone +- added: info-contact +- Device: IPV4 and IPV6 changed to represent just one IP. Net mask is no more valid. +- global tags definition +- adopted lowerCamelCase for OperationId +- added descriptions for Delte and Get (for specific resource) methods +- added missing operationid +- improvement of callback definition +- added "description" to the TrafficInfluence resource +- added "description" to the PatchTrafficInfluence resource +- added "description" to TrafficInfluenceNotification +- added "description" to NetworkAccessIdentifier +- added "description" to ErrResponse +- added "description" to message +- added "description" to status +- added "description" to ErrorInfo +- removed unused error code SessionNotFound404 + +## References + +[1] 3GPP TS 23.501: System architecture for the 5G System (5GS); Stage 2 (Release 17), V17.4.0 (2022-03) +[2] CAMARA Commonalities : Authentication and Authorization Concept for Service APIs https://github.com/camaraproject/IdentityAndConsentManagement/blob/main/documentation/CAMARA-API-access-and-user-consent.md diff --git a/documentation/SupportingDocuments/API_Documentation/Traffic_Influence_API_Readiness_Checklist.md b/documentation/SupportingDocuments/API_Documentation/Traffic_Influence_API_Readiness_Checklist.md new file mode 100644 index 00000000..c3a4304c --- /dev/null +++ b/documentation/SupportingDocuments/API_Documentation/Traffic_Influence_API_Readiness_Checklist.md @@ -0,0 +1,13 @@ +# Traffic Influence (TI) API Readiness minimum criteria checklist + +
+ +| No | Deliverables/Criteria | Mandatory | Status (Contributed/Approved/Pending/Validated/Partly-Validated)| +|----|----------------------------------|-----------|---------------------------- +| 1 |API Spec | Y | Contributed | +| 2 |API Implementation | N | -- | +| 3 |API Documentation | Y | Contributed | +| 4 |User Stories | Y | Contributed | +| 5 |API test cases | Y | Drafted Gherkin feature | +| 6 |Validated by atleast 2 operators | Y | Under validation by TIM | +| 7 |Security review | Y | Contributed | diff --git a/documentation/SupportingDocuments/API_Documentation/User Stories/Edge.Cloud.Lifecycle.Management.User.Story.md b/documentation/SupportingDocuments/API_Documentation/User Stories/Edge.Cloud.Lifecycle.Management.User.Story.md new file mode 100644 index 00000000..df17649a --- /dev/null +++ b/documentation/SupportingDocuments/API_Documentation/User Stories/Edge.Cloud.Lifecycle.Management.User.Story.md @@ -0,0 +1,82 @@ + +Edge Cloud Lifecycle Management User Story +_This document is based on the [CAMARA Commonalities template for User Stories](https://github.com/camaraproject/Commonalities/blob/main/documentation/Userstory-template.md)_ +_Roles are referenced from the ITU-T Cloud Refence Architecture._ + +## Summary +"As an Application Developer, I want to determine the Edge Cloud Zone more suitable for my application, being aware of all the options available their status and region of interest. +I want to be able to put my application available in the selected Edge Cloud Zone or Region in a simpler manner providing both artifacts and metadata for instantiating my application succesfully at the same time I want to be able to terminate +running instances of my application on a particular Edge Zone or Region and also to remove information of the whole application itself ". + +This story includes the whole journey from discovering Edge Cloud Zones available to run instances of the application and terminate them : + + +## Actors, Roles, and Scope +| Actor | Role | Scope | +|-------|------|-------| +|Application Provider (AP) |API Consumer | API requester | +|Operator Platform (OP)|Edge Cloud Provider | API Publisher | +|Edge Infrastructure Provider (EIP)|Edge Cloud Provider| + +Note the role of Edge Cloud Provider may be played by either the Operator or a Hyperscaler. + +## Pre-conditions +The AP has a resource usage agreement with the Operator Platform + +| Item | Description | Support Qualifier | +|----|----|----| +|Summary|Network operators offers a Multi-access Edge Computing platform in a given territory with several levels of abstraction being the Edge Cloud Zone the lowest one. Network operators offers a service through EdgeCloud APIs that permits application providers to deploy instances of an application in one or several Edge Cloud Zones, and to Applications Users the posibility to chose the most appropriate Edge Cloud Zone available at a given moment| M | +|Pre-conditions|The AP has a resource usage agreement with the Operator Platform| M | +|Begins when|The Application Provider (AP) invokes the EdgeCloud API to submit at application with references to obtain all needed data for their instantiation (container images or VM images and manifests describing required resources by an application)| M | +|Step 1|The OP authorizes the request (terminates with a notification to the AP if it is not valid)| M | +|Step 2|The OP validates the request (terminates with a notification to the AP if content is not valid)| M| +|Step 3|The OP stores the app information and returns an Id for reference (terminates with a notification to the AP if error)| M | +|Step 4|The OP request information of currently available Edge Cloud Zones and Regions and their status| M | +|Step 4|The AP invokes the EdgeCloud API to instantiate the application in a given Region, it can also include an specific Edge Cloud Zone referencing previously generated appId | M | +|Step 5|The OP validates the request and if AppId and parameters provided are valid, returns an object including references to one instance Id per Edge Cloud Zone with an instantiation status "instantiating" and starts deploying app instance in EdgeCloud Zones that meet the input criteria| M | +|Step 6|The AP may request updated information of existing app instances of a given app. Possible status for app instantiation includes "ready" also information for endpoint info is provided for the app instance| O | +|Step 7|App instance may provide service for end users | O | +|Step 8|The AP request termination of one app instance (optionally all app instances in a given region) | M | +|Step 8|The OP validates the request (terminates with a notification to the UE if content is not valid e.g. given appId does not exist)| M| +|Step 9|The OP response to the AP and starts the termination of the app instance, moving its status to terminating| M| +|Step 10|The UE connects to the provided EAS and start using the application| M| +|Ends when|The UE connects to the EAS| M | +|Post-conditions|The UE is connected to the most adequate EAS, it may request to reconnect (repeat Step 10) at any time if the perceived quality is not adequate| M | +|Exceptions|
  • During the step 2 the , the OP can not be able to download the image
  • During the step 5 the Edge cloud zone resources are not available | M | + + + +## Flow +```mermaid +sequenceDiagram + participant AP + participant OP + participant EIP + Note over AP,OP: PRE App on device attached
    to operator network + Note over AP,OP: PRE App developer registered,
    authenticated and authorised + AP->>OP: GET /edge-cloud-zone + OP->>AP: Returns the information about the Edge cloud zones (edgeCloudZoneInfo) + alt app has a local mapping of server endpoints to Edge Cloud Zones + AP->>OP: POST /app Information about app to be instantiate(appManifest) + OP->>AP: Returns the identificator of the submitted app (appId) + AP->>OP: GET /app?appId=UUID Information about app(appId) to be instantiate(appManifest) + OP->>AP: Returns the information requested (appManifest) + AP->>OP: DELETE /app (appId) Delete app for a given appId (Manifest and any related information) + OP->>AP: Request accepted + AP->>OP:POST /app Instantiate application (appId) in a determinated Edge Cloud Zone(edgeCloudZoneId) + OP->>EIP: Instantiate instance in a determinated Edge Cloud Zone(edgeCloudZoneId) + EIP->>OP: Application instantiated + OP->>AP:Returns the appInstance created + AP->>OP: GET /app (appId) /Instance?appID=UUID Information about app(appId) instantiated (appInstanceInfo) + OP->>AP: Returns the application instance information + AP->>OP: DELETE /app (appId) DELETE Running instance for a given appId. + alt delete only the instance related with the appId + OP->>EIP: Delete instance + EIP->>OP: Instance deleted + OP->>AP: Application instance deleted + end + end +``` + + + diff --git a/documentation/SupportingDocuments/API_Documentation/User Stories/Simple Edge Discovery User Story.md b/documentation/SupportingDocuments/API_Documentation/User Stories/Simple Edge Discovery User Story.md new file mode 100644 index 00000000..56c6e14e --- /dev/null +++ b/documentation/SupportingDocuments/API_Documentation/User Stories/Simple Edge Discovery User Story.md @@ -0,0 +1,113 @@ +# Simple Edge Discovery User Story +_This document is based on the [CAMARA Commonalities template for User Stories](https://github.com/camaraproject/Commonalities/blob/main/documentation/Userstory-template.md)_ +_Roles are referenced from the ITU-T Cloud Refence Architecture._ + +## Summary +"As an Application Developer, I want to determine the Edge Cloud Zone with the shortest network path to a particular end user, so that I can minimise the network packet delay and improve the end user's experience". + +This story has two outcomes: + +"As an Application Developer, once I have discovered the closest Edge Cloud Zone, then either + +Outcome 1) I can connect the application client to my server hosted on that Edge Cloud Zone, using my previous knowledge of the endpoint (IP address) for that particular server.. + +Outcome 2) _Using another tool e.g. edge cloud provider dashboard or CLI_, I can deploy an application server to the Edge Cloud Zone indicated in the API response, and then connect the application client to that server's IP address." + +The story covers two scenarios: +1. Request made from network-attached application client +2. Request made from Internet-hosted application server + + + +## Actors, Roles, and Scope +| Actor | Role | Scope | +|-------|------|-------| +|App Developer |CSC: User | API request| +|Developer Admin |CSC: Administrator, CSC: Business Manager |Prospect to Order (P2O)| +|Operator|Edge Cloud Provider, API Publisher | +|Hyperscaler|Edge Cloud Provider| + +Note the role of Edge Cloud Provider may be played by either the Operator or a Hyperscaler. + +## Pre-conditions +1. App Developer has succesfully registered to use the Simple Edge Discovery API for the Operator (or, the Developer Admin has performed this on the App Developer's behalf) +2. App Developer has succesfully registered to deploy applications on the Edge Cloud Zone(s) of the Edge Cloud Provider (or, the Developer Admin has performed this on the App Developer's behalf). +(Note, the API may still be called without this pre-condition, but the APP Developer will not be able to fulfil the Goal described above). + +# Scenario 1: Network-attached application client initiates API request +Constraints: +- Network: cellular (4G/5G) or Wi-Fi. If the operator only provides a cellular edge cloud then Wi-Fi connected devices will be out of scope for thier implemementation of this API. +- Application: none, browser or app calls API over HTTP +- Northbound Interface only (no 'UNI' client SDK required) + +Note: +- the Edge Cloud Zone may be hosted by the operator or a 3rd party hyperscaler (in which case the developer will need an account with that hyperscaler to create instances) + +## Begins When + +```mermaid +sequenceDiagram + participant app + participant operator + participant developer server + participant edge cloud provider + Note over app,operator: PRE App on device attached
    to operator network + Note over developer server,operator: PRE App developer registered,
    authenticated and authorised + app->>operator: GET /edge-cloud-zone?filter=closest (Header: device identifier(s) or source IP) + operator->>app: name of closest Edge Cloud Zone + alt app has a local mapping of server endpoints to Edge Cloud Zones + app->>app: lookup app server endpoint (Edge Cloud Zone name) + app->>operator: connect to app server endpoint + else no local mapping + app->>developer server: report closest Edge Cloud Zone for app + opt spin up instance on closest Edge Cloud Zone + developer server->>edge cloud provider: create instance(Edge Cloud Zone name) + edge cloud provider->>developer server: instance endpoint + developer server->>app: instance endpoint + end + end +``` + + +## Post conditions +The App Developer is now aware of the closest Edge Cloud Zone to the device passed in the API request, , and may enact one of the outcome options shown in the sequence diagram above. + +## Exceptions +If the device identified is on an operator network that does not have access to an Edge Cloud Zone (for example, an operator may have a mobile edge but no fixed edge) then the API call will fail. + +# Scenario 2: Internet-hosted application server initiates API request +Constraints: +- Network: cellular (4G/5G) or Wi-Fi. If the operator only provides a cellular edge cloud then Wi-Fi connected devices will be out of scope for thier implemementation of this API. +- Application: none, browser or app calls API over HTTP +- Northbound Interface only (no 'UNI' client SDK required) +- Dependency: the call must include an identifier for the terminal (UE) for which 'closest Edge Cloud Zone' is being calculated + +Note: the Edge Cloud Zone may be hosted by the operator or a 3rd party hyperscaler (in which case the developer will need an account with that hyperscaler to create instances) + +## Begins When + +```mermaid +sequenceDiagram + participant app + participant operator + participant developer server + participant edge cloud provider + Note over developer server,operator: PRE developer has acquired an identifier for the terminal in question + Note over developer server,operator: PRE App developer registered,
    authenticated and authorised + developer server->>operator: GET /edge-cloud-zone?filter=closest (Header: device identifier(s)) + operator->>developer server: name of closest Edge Cloud Zone + opt inform app + developer server->>app: report closest Edge Cloud Zone for app + end + opt spin up instance on closest MEC platform + developer server->> edge cloud provider: create instance(Edge Cloud Zone) + edge cloud provider->>developer server: instance endpoint + developer server->>app: instance endpoint + end +``` + +## Post conditions +The App Developer is now aware of the closest Edge Cloud Zone to the device passed in the API request, and may enact one of the outcome options shown in the sequence diagram above. + +## Exceptions +If the device identified is on an operator network that does not have access to an Edge Cloud Zone (for example, an operator may have a mobile edge but no fixed edge) then the API call will fail. diff --git a/api_proposal/Userstory_Traffic Influence_TIM.md b/documentation/SupportingDocuments/API_Documentation/User Stories/Userstory_Traffic Influence_TIM.md similarity index 100% rename from api_proposal/Userstory_Traffic Influence_TIM.md rename to documentation/SupportingDocuments/API_Documentation/User Stories/Userstory_Traffic Influence_TIM.md diff --git a/documentation/SupportingDocuments/About the Edge Cloud Group/.DS_Store b/documentation/SupportingDocuments/About the Edge Cloud Group/.DS_Store new file mode 100644 index 00000000..5564c49f Binary files /dev/null and b/documentation/SupportingDocuments/About the Edge Cloud Group/.DS_Store differ diff --git a/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/.DS_Store b/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/.DS_Store new file mode 100644 index 00000000..509ac172 Binary files /dev/null and b/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/.DS_Store differ diff --git a/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/Minutes/MoM - Edge Selection sug-group 20230425.md b/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/Minutes/MoM - Edge Selection sug-group 20230425.md new file mode 100644 index 00000000..da6b3dfe --- /dev/null +++ b/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/Minutes/MoM - Edge Selection sug-group 20230425.md @@ -0,0 +1,40 @@ +# Edge Selection sub-group meeting + +Date: 25 – April - 2023 + +## Attendees + +* Cristina Santana Casillas (TEF) +* Sergio Francisco Ortiz (TEF) +* Andre Florath (DT) +* Prashant Goswami (DT) +* Thomas Vits (EdgeXR) +* Deepak Gunjal (Capgemini) +* Mark Cornall (GSMA) +* Mahesh Chapalamadugu (5GFF-Verizon) +* Kevin Smith (5GFF-Vodafone) +* Toshiyasu Wakayama (KDDI) + + +## Topics + + +* Talk about project charter + + First version prepared by Thomas with some comments from Deepak and Kevin to be shared and uploaded in github for all to be able to review and comment. To be reviewed in next meeting in more detail. + +* Intents Review + + First discussion in detail about intent 1 from pdf in https://github.com/camaraproject/EdgeCloud/pull/88 + + Actions points for next meeting (9th of May): + +| Owner | Action point | +| ---- | ---- | +| Kevin | Convert pdf into markdown format to facilitate updates it may be reused current thread Describing and harmonising the Edge APIs | +|EdgeXR,Capgemini, 5GFF| Each contributor to review in detail first 5 intents and have ready inputs and outputs of involved APIs to facilitate discussion. | + +* Others + + Scope of this subgroup includes EdgeSelection and APP lifecycle management, it may be needed to rename to avoid confusion of only related to EdgeSelection. It does not include Trrafic influence. + Proposed name: EdgeSelection and APP LCM sub-group diff --git a/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/ProjectCharter_EdgeSelection_ApplicationLifecycle_Subgroup.md b/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/ProjectCharter_EdgeSelection_ApplicationLifecycle_Subgroup.md new file mode 100644 index 00000000..abee2700 --- /dev/null +++ b/documentation/SupportingDocuments/About the Edge Cloud Group/Edge Selection and lifecycle subgroup charter/ProjectCharter_EdgeSelection_ApplicationLifecycle_Subgroup.md @@ -0,0 +1,37 @@ +**Edge Selection and Application Lifecycle Working Group Project Charter** + +**Introduction** + +The Edge Selection and Application Lifecycle Working Group ("ESALG") is a subgroup within the Edge Cloud Working Group, operating under the CAMARA Project. 'Edge Cloud' here refers to cloud resources (compute, storage, networking etc.) hosted at a telco operator 'Edge' – meaning within the operator's own domain and not on the public Internet. Any devices (smartphones, tablets, sensors etc.) connected to that operator's network will benefit from reduced application latency, because the network communication path from client to edge-hosted server is significantly reduced compared to the public Internet. The Working Group focuses on the development of APIs for edge selection and edge application lifecycle, while considering contributions from 5GFF, Capgemini, and EdgeXR and potentially additional contributions from other group members. The primary goal of this subgroup is to align on the basic model and architecture of edge selection and edge application lifecycle, defining the semantics of edge selection and ,scope and structure of north-bound APIs. + +**Scope** + +- The Edge Selection Working Group will focus on developing APIs specifically for edge selection and edge application lifecycle, taking into account existing contributions from 5GFF, Capgemini, and EdgeXR and additional contributions from group members. +- The Working Group will align on the basic model and architecture of edge selection and edge application lifecycle, defining what is meant by edge selectionthe functional scope and who can or should call these APIs. +- As per the CAMARA project charter, the functional scope of the Working Group is limited to telco APIs, which includes APIs in the domain of telco mobile networks or telco fixed-line networks [[Technical Charter of the CAMARA Project](https://github.com/camaraproject/Governance/blob/main/ProjectCharter.md#scope-of-the-project)]. + +**Non-goals** + +- The Working Group will not focus on generic enterprise APIs, as the scope is limited to telco APIs in accordance with the Technical Charter of the CAMARA Project. +- Developing or proposing APIs that do not align with the overall CAMARA project's objectives, scope, and design principles. +- APIs that are not designed to be used by application developers, i.e. southbound APIs of an edge system towards the infrastructure or east-west-bound APIs to federate with other edge systems. + +**Deliverables** + +- Edge selection and edge application lifecycle APIs that align with the CAMARA Project's principles and objectives. +- Comprehensive documentation for the developed edge selection APIs. +- Test plans, cases, and tools for validating the functionality and performance of the proposed edge selection APIs. +- Recommendations and guidelines for API version alignment, implementation choices +- Optionally reference implementations of the aligned APIs + +**Governance** + +The Edge Selection and Application Lifecycle Working Group will follow the governance structure and principles outlined in the CAMARA Project's technical charter. This includes adhering to the project's principles of being open, welcoming and respectful, transparent and accessible, and merit-based. The Working Group will work under the guidance and direction of the Steering Committee and collaborate with other Working Groups, Sub Projects, and its parent group, the Edge Cloud Working Group, as necessary. + +**Timeline and Milestones** + +The timeline and milestones for the Edge Selection and Application Lifecycle Working Group will be defined by the Steering Committee in collaboration with the Working Group participants. The Working Group will provide regular updates on its progress and deliverables to the Steering Committee and other relevant stakeholders. + +**Amendments** + +This charter may be amended by the Steering Committee following consultation with the Edge Selection and Application Lifecycle Working Group participants. Any proposed changes will be communicated to all Project participants and discussed in an open and transparent manner. diff --git a/documentation/Presentation/EdgeCloud Group.pdf b/documentation/SupportingDocuments/About the Edge Cloud Group/EdgeCloud Group.pdf similarity index 100% rename from documentation/Presentation/EdgeCloud Group.pdf rename to documentation/SupportingDocuments/About the Edge Cloud Group/EdgeCloud Group.pdf diff --git a/documentation/Contributions/Proposal - Edge Cloud Rapository organization.md b/documentation/SupportingDocuments/About the Edge Cloud Group/Proposal - Edge Cloud Rapository organization.md similarity index 100% rename from documentation/Contributions/Proposal - Edge Cloud Rapository organization.md rename to documentation/SupportingDocuments/About the Edge Cloud Group/Proposal - Edge Cloud Rapository organization.md diff --git a/documentation/SupportingDocuments/Edge terminology/edge_terminology.md b/documentation/SupportingDocuments/Edge terminology/edge_terminology.md new file mode 100644 index 00000000..b0707530 --- /dev/null +++ b/documentation/SupportingDocuments/Edge terminology/edge_terminology.md @@ -0,0 +1,61 @@ +| Term | Definition | +|------|------------| +| A | | +|API Consumer | The entity making an API request. This typically refers to an **Application Client**, but APIs may also be consumed by remote servers. | +|Application Backend Part | An architectural part of an application that is to be deployed on public or private (and central) cloud infrastructure.| +|Application Client | A specifically developed client component of an application. | +|Application Edge Part | An architectural part of an **Edge Application** that is to be deployed on edge compute cloudlets. An End-to-End Application may include multiple Application Edge Parts (e.g. microservices).| +|Application Instance | An instantiation of an **Application Edge Part** on a Cloudlet. | +|Application Provider | The provider of the application that accesses the **OP** to deploy its application on the Edge Cloud, thereby using the **Edge Resources** and network resources. An Application Provider may be part of a larger organisation, like an enterprise, enterprise customer of the **OP**, or be an independent entity.| +|Application Service Provider | The developer/publisher who deploys applications on **MEC platforms**. | +| B | | +| C | | +|Cloudlet| A point of presence for the **Edge Cloud**. It is the point where **Edge Applications** are deployed. A Cloudlet offers a set of resources at a particular location (either geographically or within a network) that would provide a similar set of network performance.| +| D | | +|Density | Minimum 4G/5G subscriber density in a geographical area, represented as the number of subscribers per square kilometer.| +| E | | +|Edge Application | A cloud application that has some services deployed to **MEC Platforms** to take advantage of low latency and high bandwidth when interacting with devices. It may includes one or more Application Edge Parts (e.g. microservices).| +|Edge Cloud | A collection of **MEC Platforms**, which may be hosted by one or more **TSPs**| +|Edge Resource | An object defined by the service provider representing an edge resource within its network domain, such as a MEC Platform.| +| F | | +|Flavour | A set of characteristics for compute instances that define the sizing of the virtualised resources (compute, memory, and storage) required to run an application. Flavours can vary between operator networks.| +| G | | +| H | | +| I | | +| J | | +| K | | +| L | | +| M | | +|MEC | Multi-access Edge Computing (MEC), a means of hosting applications within the TSPs core network, reducing propogation delay and hence latency. | +|MEC Platform | A collection of cloud computing resources housed in a **TSP**'s network facility that provides Multi-access Edge Computing (**MEC**) capabilities. | +| N | | +|NorthBound Interface | NBI, The interface that exposes the Operator Platform to Application Providers. | +| O | | +|Optimal MEC Platforms | A list of one or more optimal **MEC Platforms** to register a **Service Endpoint**, based on the latency and availability of each MEC platform, and optionally also based on various query criteria (Service Profile, Region, subscriber density or UE identity) defined by the API Consumer. | +|Optimal MEC Service Endpoints | A list of one or more MEC **Service Endpoints** that provide optimal user experience to the API Consumer, based on internal network conditions known to the **MEC Platform**, and also optionally based on various query criteria (Service Profile, Region, subscriber density or UE identity) defined by the API Consumer. | +|Operator Platform | An Operator Platform (**OP**) facilitates access to the Edge Cloud capability of an Operator/**TSP** or federation of Operators and Partners.| +| P | | +| Q | | +| R | | +|Region | A **TSP** defined string identifier representing a certain geographical or logical area where MEC resources and services are provided.| +|Registered MEC Hosted Services | Applications running on **MEC platforms** which are registered with **Edge Discovery Service** using the service registry APIs.| +| S | | +|Service Endpoint | The routable endpoint of the service(s) within a deployed application that clients connect to, where a service is a subcomponent of application| +|Service Profile | Information about the MEC application and the associated service characteristics.| +| T | | +|Tenant | The commercial owner of the applications and the associated data.| +|Tenant Space | A Tenant Space is a subset of resources from a **Cloudlet** that are dedicated to a particular tenant. A Tenant Space has one or more Virtual Machines (VMs) running native or containerised applications or cover a complete server.| +| TSP | Telecommunications Service Provider, aka network operator | +| U | | +|UE| acronym for **User Equipment**| +|UEIdentity | User Equipment identity, which can be a device's IP address, MSISDN, IMEI, MDN, or GPSI.| +|User Client | (term specific to GSMA Edge Cloud API, not used in 5GFF APIs ) Functionality that manages on the user's side the interaction with the OP. The User Client (UC) represents an endpoint of the UNI and is a component on the User Equipment. UCs and Application Clients are deployed on the User Equipment. | +|User Equipment (UE) | Any device with a SIM used directly by an end-user to communicate using Telecom wireless network connectivity , e.g. a smartphone, tablet, e-watch, etc. | +|User-Network Interface (UNI) | (term specific to GSMA Edge Cloud API, not used in 5GFF APIs) Enables the **UC hosted** in the user equipment to communicate with the OP. | +| V | | +| VM | Virtual Machine | +| W | | +| X | | +| Y | | +| Z | | +|Zone | A logical collection of **MEC Platforms** in a telecommunication provider's network. A Zone is part of a **Region**.| diff --git a/documentation/SupportingDocuments/Harmonisation of APIs/CAMARA_EdgeCloud_Harmonising_APIs_First_intents_review.pdf b/documentation/SupportingDocuments/Harmonisation of APIs/CAMARA_EdgeCloud_Harmonising_APIs_First_intents_review.pdf new file mode 100644 index 00000000..6b0cd37a Binary files /dev/null and b/documentation/SupportingDocuments/Harmonisation of APIs/CAMARA_EdgeCloud_Harmonising_APIs_First_intents_review.pdf differ diff --git a/documentation/Presentation/EdgeXR_forCAMARAEdgeCloudWG_20220719.pdf b/documentation/SupportingDocuments/Harmonisation of APIs/EdgeXR_forCAMARAEdgeCloudWG_20220719.pdf similarity index 100% rename from documentation/Presentation/EdgeXR_forCAMARAEdgeCloudWG_20220719.pdf rename to documentation/SupportingDocuments/Harmonisation of APIs/EdgeXR_forCAMARAEdgeCloudWG_20220719.pdf diff --git a/documentation/Presentation/MEC & Deploymen APIs propossal_20220719.pdf b/documentation/SupportingDocuments/Harmonisation of APIs/MEC & Deploymen APIs propossal_20220719.pdf similarity index 100% rename from documentation/Presentation/MEC & Deploymen APIs propossal_20220719.pdf rename to documentation/SupportingDocuments/Harmonisation of APIs/MEC & Deploymen APIs propossal_20220719.pdf diff --git a/documentation/SupportingDocuments/Harmonisation of APIs/describing and harmonising the Edge APIs.md b/documentation/SupportingDocuments/Harmonisation of APIs/describing and harmonising the Edge APIs.md new file mode 100644 index 00000000..06e1f9c4 --- /dev/null +++ b/documentation/SupportingDocuments/Harmonisation of APIs/describing and harmonising the Edge APIs.md @@ -0,0 +1,160 @@ +# Describing and harmonising the Edge APIs +## Abstract +Several 'edge cloud' APIs have been proposed for CAMARA. +- 5GFF have contributed [Simple Edge Discovery](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/simple_edge_discovery.yaml), and [MEC Exposure and Experience Management](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/MEC%20exposure%20and%20experience%20management.yaml). +- EdgeXR have contributed [application client edge interaction APIs](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/app-client.yaml), [Controller APIs for Apps)](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/App.yaml) and a [Session management API](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/session.yaml). +- GSMA OPAG/Capgemini have contributed the [MEC Edge Cloud API](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/EdgeCloudApi_v0.0.5.yaml) + +The goal is to harmonise/combine the APIs into a single set of definitions. This document provides information to meet that goal, including: +- listing all the intents delivered by the APIs, from both developer and operator perspectives, +- listing the constraints of each API, +- illustrating the workflow of each API, +- identifying and agreeing diffrences in terminology between the APIs, +- aligning to the Camara Commonalities [API design guidelines](https://github.com/camaraproject/WorkingGroups/blob/main/Commonalities/documentation/API-design-guidelines.md) when it is finalised. + +## A brief description of the various APIs + 'Simple Edge Discovery' only has one operation, to GET the name of the closest MEC to the network-attached device that hosts the application that made the API request (e.g. an app on a smartphone). 'Simple Edge Discovery' is a subset of the 'MEC Exposure and Experience Management' API. + +The 5GFF 'MEC Exposure and Experience Management', EdgeXR, and CapGemini APIs are richer APIs that include Edge aplication lifecycle workflows and session management. The EdgeXR and GSMA OPAG/Capgemini APIs are based on GSMA Operator Platform architecture. + +_(Editor note: do both EdgeXR and GSMA OPAG/Capgemini definitions require UNI for execution on a UE?)_ + +_Note, the [Traffic Influence API](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/Traffic_Influence.yaml) in the Edge Cloud repository covers a different scenario and is not discussed here._ + +## Terminology used +Please refer to the [Edge Terminology document](https://github.com/camaraproject/EdgeCloud/blob/main/documentation/Contributions/edge_terminology.md) + +## Intents and mapping to APIs +How to use this table: +- If an API supports an intent its name will appear in **bold**. +- If an API does not support an intent, its name is in ~~strikethrough.~~ +- If an API partially supports an intent, or we are not sure, its name is in _italics_ and followed by a '?' +Abbreviations used for API names: +- 5SED = 5GFF Simple Edge Discovery +- 5MEE = 5GFF MEC Exposure & Experience Management +- EXRC = EdgeXR application client edge interaction APIs +- EXCA = EdgeXR Controller APIs for Apps +- EXSM = EdgXR Session Management API +- GMEC = GSMA OPAG/Capgemini MEC Edge Cloud API + +### Developer intents +#### Provisioning intents +1. “I can retrieve a list of the operator’s MECs and their status, ordering the results by location and filtering by status (active/inactive/unknown)” ~~5SED~~ **5MEE** **EXRA** +2. "I can discover the capabilities/resources available at an operator’s MEC: CPU, Memory, Storage, GPU" ~~5SED~~ **5MEE** **EXRA** +3. "I can discover the geographical regions covered by the operators MECs" ~~5SED~~ **5MEE** **EXRA** +4. "I can discover the closest MEC platform to a specific terminal (closest in terms of shortest network path)" **5SED** **5MEE** **EXRC** +5. "I can ask the operator to provision my application server to the optimal MEC for a specific terminal, taking into account connectivity, resources (e.g. vCPU, Memory, network interfaces, storage, GPU) shortest network path, cost, network load, MEC platform load, application privacy considerations etc." ~~5SED~~ **5MEE** **EXRA** **GMEC** + * "I can ask the operator to provision my application server to all MECs that meet these criteria (note this is not focussing on a specific terminal)" + * "I can ask the operator to provision my application server to a minimal set of MECs that meet these criteria across a given footprint (note this is not focussing on a specific terminal)" +6. "I can ask the operator to inform me if the optimal MEC for my application and a specific terminal changes, taking into account mobility events, connectivity, shortest network path, cost, network load, MEC platform load etc." ~~5SED~~ **5MEE** **EXRC** +7. “I can ask the operator to store artifacts e.g., container images or VM images and manifests describing required resources, Helm charts etc” **GMEC** +8. “I can ask the operator to provide the artifacts details for already stored artifacts” **GMEC** +9. “I can query the list of applications linked with a given artifact” **GMEC** +10. "I can ask the operator to link artifacts to the applications when onboarding my applications" **GMEC** +11. "I can ask the operator to delete an existing artifact(s)" **GMEC** +12. "I can ask the operator to reserve compute, network and storage required for my application in various MEC locations" **GMEC** +13. “I can ask the operator to use reserved resources for my application to earlier on various MEC locations” **GMEC** +14. "I can ask the operator to delete an existing reserve reservation" **GMEC** +15. “I can ask the operator to remove my application from a set of MEC locations” **GMEC** +16. “I can ask the operator to provide the details of all the onboarded applications” **5MEE** **GMEC** +17. "I can ask the operator to inform about the application instance details e.g., communication endpoints, resource consumed etc" **5MEE** **GMEC** +18. "I can ask the operator to terminate the running instance of my application" **GMEC** + +#### Runtime intents +19. "I can discover the closest MEC platform to a particular terminal (closest in terms of shortest network path)" **5SED** **5MEE** **EXRC** +20. "I can discover the optimal MEC platform for my application and a particular terminal, taking into account connectivity, shortest network path, cost, network load etc." (`A`) ~~5SED~~ **5MEE** **EXRC** +21. "I can discover the optimal application service endpoint for a specific terminal, taking into account mobility events, connectivity, shortest network path, cost, network load, MEC platform load etc." ~~5SED~~ **5MEE** **EXRC** +22. "I can ask the operator to move my running application instance to a different MEC if the closest MEC changes, taking into account mobility events, connectivity, shortest network path, cost, network load, MEC platform load etc." `B` ~~5SED~~ _5MEE?_ _EXRC_? +### Operator intents +#### Provisioning intents +23. “I can publish an (ordered, filtered) list of my MECs, their coverage, capabilities and status” _(aligns with 1,2,3 in the developer intents)_ ~~5SED~~ **5MEE** **EXRA** +24. “I can map an application’s requirements to the best MEC for hosting it, based on application demands for CPU,Memory,Storage,GPU,bandwith,Network forecast, mobility” _(aligns with 4,5,8,9)_ ~~5SED~~ **5MEE** **EXRA** +#### Runtime intents +25. “I can inform the developer of any event which changes which MEC is optimal for their application and connected terminals” _(aligns with 6)_ ~~5SED~~ **5MEE** **EXRC** +26. “I can move a running application to a new MEC and inform the developer of the new service endpoint to connect to” `B` _(aligns with 10)_ ~~5SED~~ _5MEE?_ _EXRC_? + +**Notes**: +* `A` this may not be the closest MEC, rather the 'best MEC for this job' which accounts for current MEC or network load, MEC copmute power and features etc. +* `B` the operator may wish to achieve this through signalling the terminal to change to a network anchor point ('user plane function'/'packet gateway) instead. + +## Constraints of the APIs +### Simple Edge Discovery +- not application aware (does not take into account the application's requirements for MEC, e.g. compute resources) +- may be called by either: (1) the network-attached UE hosting the client application, or (2) an application developer's server. + +### MEC Exposure & Experience Management +- no constraints (to be checked) + +### GSMA/MobiledgeX +- requires UNI to be called from the UE hosting the client application + +## API Workflows +### Simple Edge Discovery +#### Scenario 1: direct request from client on terminal device + +Constraints: +- Network: cellular (4G/5G) +- Application: none, browser or app calls API over HTTP +- Northbound Interface only (no 'UNI' client SDK required) + +Note: +- the MEC platform may be hosted by the operator or a 3rd party hyperscaler (in which case the developer will need an account with that hyperscaler to create instances) + + +```mermaid +sequenceDiagram + participant app + participant operator + participant developer server + participant MEC platform + Note over app,operator: PRE App on device attached
    to operator network + Note over developer server,operator: PRE App developer registered,
    authenticated and authorised + app->>operator: GET /mecplatforms + operator->>app: name of closest MEC platform + alt app has a local mapping of server endpoints to MEC platforms + app->>app: lookup app server endpoint (MEC platform name) + app->>operator: connect to app server endpoint + else no local mapping + app->>developer server: report closest MEC for app + opt spin up instance on closest MEC platform + developer server->>MEC platform: create instance(MEC platform name) + MEC platform->>developer server: instance endpoint + developer server->>app: instance endpoint + end + end +``` +#### Scenario 2: request from developer server + +Constraints: +- Network: WiFi or cellular (4G/5G) +- Application: none, browser or app calls API over HTTP +- Northbound Interface only (no 'UNI' client SDK required) +- Dependency: the call must include an identifier for the terminal (UE) for which 'closest MEC' is being calculated + +Note: the MEC platform may be hosted by the operator or a 3rd party hyperscaler (in which case the developer will need an account with that hyperscaler to create instances) + +```mermaid +sequenceDiagram + participant app + participant operator + participant developer server + participant MEC platform + Note over developer server,operator: PRE developer has acquired an identifier for the terminal in question + Note over developer server,operator: PRE App developer registered,
    authenticated and authorised + developer server->>operator: GET /mecplatforms?ueIdentityType={value}&ueIdentity={value} + operator->>developer server: name of closest MEC platform + opt inform app + developer server->>app: report closest MEC for app + end + opt spin up instance on closest MEC platform + developer server->> MEC platform: create instance(MEC platform name) + MEC platform->>developer server: instance endpoint + developer server->>app: instance endpoint + end +``` +# MEC Exposure and Experience Management +(todo) + +# EdgeXR APIs +(todo) + diff --git a/documentation/SupportingDocuments/Harmonisation of APIs/edgemodel.md b/documentation/SupportingDocuments/Harmonisation of APIs/edgemodel.md new file mode 100644 index 00000000..c2e4aad8 --- /dev/null +++ b/documentation/SupportingDocuments/Harmonisation of APIs/edgemodel.md @@ -0,0 +1,45 @@ +```mermaid +erDiagram + APPLICATION_CLIENT }|--|| APPLICATION_INSTANCE : exchanges_userdata + APPLICATION_CLIENT{ + string application_id + } + APPLICATION_INSTANCE }|--|| APPLICATION_EDGE_PART : is_instantiated_of + APPLICATION_BACKEND_PART o{--|| APPLICATION_CLIENT : exchanges_userdata + APPLICATION_INSTANCE }|--o{ APPLICATION_BACKEND_PART : exchanges_userdata + APPLICATION_INSTANCE{ + string application_id + string service_endpoint + } + APPLICATION_SERVICE_PROVIDER ||--|{ APPLICATION_CLIENT: provides + APPLICATION_SERVICE_PROVIDER ||--|{ APPLICATION_EDGE_PART: onboards + APPLICATION_EDGE_PART{ + string application_id + string flavor + } + APPLICATION_SERVICE_PROVIDER ||--o{ APPLICATION_BACKEND_PART: provides + APPLICATION_INSTANCE }|--|| CLOUDLET : is_deployed_on + CLOUDLET { + string TSP + string compute_resources + string network_resources + string location + string region + } + MEC_PLATFORM ||--|| CLOUDLET : is_same_as + EDGE_CLOUD ||--|{ MEC_PLATFORM : is_a_collection_of + EDGE_APPLICATION ||--|{ APPLICATION_EDGE_PART : includes + UE ||--|{ APPLICATION_CLIENT : is_running + UE ||..|| USER_CLIENT : is_running + UE { + string ue_identity + } + USER_CLIENT }|--|| OPERATOR_PLATFORM : communicate + OPERATOR_PLATFORM ||--|{ APPLICATION_INSTANCE : instantiates + APPLICATION_EDGE_PART }|--|| OPERATOR_PLATFORM : is_onboarded_on + OPERATOR_PLATFORM ||--|| EDGE_CLOUD : manages + USER_CLIENT ||..|| APPLICATION_CLIENT : is_embedded + USER_CLIENT { + string location + } + diff --git a/documentation/SupportingDocuments/Harmonisation of APIs/next steps for harmonising the Edge Cloud APIs.md b/documentation/SupportingDocuments/Harmonisation of APIs/next steps for harmonising the Edge Cloud APIs.md new file mode 100644 index 00000000..77a31e23 --- /dev/null +++ b/documentation/SupportingDocuments/Harmonisation of APIs/next steps for harmonising the Edge Cloud APIs.md @@ -0,0 +1,7 @@ +0. Refer to [Describing and Harmonising the APIs](https://github.com/camaraproject/EdgeCloud/blob/main/documentation/SupportingDocuments/describing%20and%20harmonising%20the%20Edge%20APIs.md) +1. Creation of a model that abstracts the three architectures (GSMA, EdgeXR, 5GFF) that underpin the contributions +2. Divide intents into for **Actions taken by a developer over the Internet** and **Actions taken by the application at runtime** +3. (these can also be further categorised into groups of intents e.g. groups including 'Provisioning', 'Edge Discovery', 'Orchestration' (more?) +4. Developer epics and journeys to be created +5. Terminology to be harmonised across the contributions +6. Small teams to work on the intent groups and report back to the main projec diff --git a/documentation/Contributions/Images/Discover UNI API.png b/documentation/SupportingDocuments/Images/Discover UNI API.png similarity index 100% rename from documentation/Contributions/Images/Discover UNI API.png rename to documentation/SupportingDocuments/Images/Discover UNI API.png diff --git a/documentation/Contributions/Images/RepositoryOrganiztion1.png b/documentation/SupportingDocuments/Images/RepositoryOrganiztion1.png similarity index 100% rename from documentation/Contributions/Images/RepositoryOrganiztion1.png rename to documentation/SupportingDocuments/Images/RepositoryOrganiztion1.png diff --git a/documentation/Contributions/Images/RepositoryOrganiztion2.png b/documentation/SupportingDocuments/Images/RepositoryOrganiztion2.png similarity index 100% rename from documentation/Contributions/Images/RepositoryOrganiztion2.png rename to documentation/SupportingDocuments/Images/RepositoryOrganiztion2.png diff --git a/documentation/Contributions/Images/RepositoryOrganiztion3.png b/documentation/SupportingDocuments/Images/RepositoryOrganiztion3.png similarity index 100% rename from documentation/Contributions/Images/RepositoryOrganiztion3.png rename to documentation/SupportingDocuments/Images/RepositoryOrganiztion3.png diff --git a/documentation/Contributions/Images/RepositoryOrganiztion4.png b/documentation/SupportingDocuments/Images/RepositoryOrganiztion4.png similarity index 100% rename from documentation/Contributions/Images/RepositoryOrganiztion4.png rename to documentation/SupportingDocuments/Images/RepositoryOrganiztion4.png diff --git a/documentation/SupportingDocuments/describing and harmonising the Edge APIs.md b/documentation/SupportingDocuments/describing and harmonising the Edge APIs.md deleted file mode 100644 index e734501c..00000000 --- a/documentation/SupportingDocuments/describing and harmonising the Edge APIs.md +++ /dev/null @@ -1,90 +0,0 @@ -# Describing and harmonising the Edge APIs -## Abstract -Several 'edge cloud' APIs have been proposed for CAMARA. -- 5GFF have contributed [Simple Edge Discovery](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/simple_edge_discovery.yaml), and [MEC Exposure and Experience Management](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/MEC%20exposure%20and%20experience%20management.yaml). -- EdgeXR have contributed [application client edge interaction APIs](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/app-client.yaml), [Controller APIs for Apps)](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/App.yaml) and a [Session management API](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/session.yaml). -- GSMA OPAG/Capgemini have contributed the [MEC Edge Cloud API](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/EdgeCloudApi_v0.0.5.yaml) - -The goal is to harmonise/combine the APIs into a single set of definitions. This document provides information to meet that goal, including: -- listing all the intents delivered by the APIs, from both developer and operator perspectives, -- listing the constraints of each API, -- illustrating the workflow of each API, -- identifying and agreeing diffrences in terminology between the APIs, -- aligning to the Camara Commonalities [API design guidelines](https://github.com/camaraproject/WorkingGroups/blob/main/Commonalities/documentation/API-design-guidelines.md) when it is finalised. - -## A brief description of the various APIs - 'Simple Edge Discovery' only has one operation, to GET the name of the closest MEC to the network-attached device that hosts the application that made the API request (e.g. an app on a smartphone). 'Simple Edge Discovery' is a subset of the 'MEC Exposure and Experience Management' API. - -The 5GFF 'MEC Exposure and Experience Management', EdgeXR, and CapGemini APIs are richer APIs that include Edge aplication lifecycle workflows and session management. The EdgeXR and GSMA OPAG/Capgemini APIs are based on GSMA Operator Platform architecture. - -_(Editor note: do both EdgeXR and GSMA OPAG/Capgemini definitions require UNI for execution on a UE?)_ - -_Note, the [Traffic Influence API](https://github.com/camaraproject/EdgeCloud/blob/main/code/API_definitions/Traffic_Influence.yaml) in the Edge Cloud repository covers a different scenario and is not discussed here._ - -## Terminology used -Please refer to the [Edge Terminology document](https://github.com/camaraproject/EdgeCloud/blob/main/documentation/Contributions/edge_terminology.md) - -## Intents and mapping to APIs -How to use this table: -- If an API supports an intent its anem will appear in **bold**. -- If an API does not support an intent, its name is in ~~strikethrough.~~ -- If an API partially supports an intent, or we are not sure, its name is in _italics_ and followed by a '?' -Abbreviations used for API names: -- 5SED = 5GFF Simple Edge Discovery -- 5MEE = 5GFF MEC Exposure & Experience Management -- EXRC = EdgeXR application client edge interaction APIs -- EXCA = EdgeXR Controller APIs for Apps -- EXSM = EdgXR Session Management API -- GMEC = GSMA OPAG/Capgemini MEC Edge Cloud API - -### Developer intents -#### Provisioning intents -1. “I can retrieve a list of the operator’s MECs and their status” ~~5SED~~ **5MEE** -2. "I can discover the capabilities/resources available at an operator’s MEC" ~~5SED~~ **5MEE** -3. "I can discover the geographical regions covered by the operators MECs" ~~5SED~~ **5MEE** -4. "I can discover the closest MEC platform to a particular UE" **5SED** **5MEE** -5. "I can ask the operator to provision my application server to the optimal MEC for a particular UE" ~~5SED~~ **5MEE** -6. "I can ask the operator to inform me if the optimal MEC for my application and a particular UE changes" ~~5SED~~ **5MEE** -#### Runtime intents -7. "I can discover the closest MEC platform to a particular UE" **5SED** **5MEE** -8. "I can discover the optimal MEC platform for my application and a particular UE" (`A`) ~~5SED~~ **5MEE** -9. "I can discover the optimal application service endpoint for a particular UE" ~~5SED~~ **5MEE** -10. "I can ask the operator to move my running application instance to a different MEC if the closest MEC changes" ~~5SED~~ _5MEE?_ -### Operator intents -#### Provisioning intents -11. “I can publish a list of my MECs, their coverage, capabilities and status” _(aligns with 1,2,3 in the developer intents)_ ~~5SED~~ **5MEE** -12. “I can map an application’s requirements to the best MEC for hosting it” _(aligns with 4,5,8,9)_ ~~5SED~~ **5MEE** -13. “I can inform the developer of any event which changes which MEC is optimal for their application and connected UEs” _(aligns with 6)_ ~~5SED~~ **5MEE** -14. “I can move a running application to a new MEC and inform the developer of the new service endpoint to connect to” _(aligns with 10)_ ~~5SED~~ _5MEE?_ - -**Notes**: -`A` this may not be the closest MEC, rather the 'best MEC for this job' which accounts for current MEC or network load, MEC copmute power and features etc. - -## Constraints of the APIs -### Simple Edge Discovery -- not application aware (does not take into account the application's requirements for MEC, e.g. compute resources) -- must be called by the network-attached UE hosting the client application - -### MEC Exposure & Experience Management -- no constraints (to be checked) - -### GSMA/MobiledgeX -- requires UNI to be called from the UE hosting the client application - -## API Workflows -# Simple Edge Discovery -(todo) - -# MEC Exposure and Experience Management -(todo) - -# EdgeXR APIs -(todo) - -# GSMA OPAG Capgemini APIs -(todo) - - - - - diff --git a/documentation/Working/README.md b/documentation/Working/README.md deleted file mode 100644 index 40a23aaf..00000000 --- a/documentation/Working/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# EdgeCloud – API\_Documentation -
    -In this folder  will be all the working documents \ No newline at end of file diff --git a/lint_function/camara-language-avoid-telco.js b/lint_function/camara-language-avoid-telco.js new file mode 100644 index 00000000..061b5431 --- /dev/null +++ b/lint_function/camara-language-avoid-telco.js @@ -0,0 +1,40 @@ +// CAMARA Project - support function for Spectral linter +// 31.01.2024 - initial version + +const replacements = [ + { original: 'UE', recommended: 'device' }, + { original: 'MSISDN', recommended: 'phone number' }, + { original: 'mobile network', recommended: 'network' } +]; + +export default async function (input) { + const errors = []; + const suggestions = []; + + // Iterate over properties of the input object + for (const path in input) { + const value = input[path]; + + // Check if the value is a string + if (typeof value === 'string') { + for (const replacement of replacements) { + const original = replacement.original; + const recommended = replacement.recommended; + + // Use a regular expression to match 'original' as a standalone word + const regex = new RegExp(`\\b${original}\\b`, 'g'); + + // Check if 'original' exists in the value + if (regex.test(value)) { + errors.push(replacement); + suggestions.push(` Telco-specific terminology found in input: Consider replacing '${original}' with '${recommended}'.`); + } + } + } + } + + // Check if any word from 'replacements' is in the suggestions + if (errors.length > 0) { + console.log(`Hint camara-language-avoid-telco ` + suggestions.join(', ')); + } +}; diff --git a/lint_function/camara-reserved-words.js b/lint_function/camara-reserved-words.js new file mode 100644 index 00000000..c28e63ab --- /dev/null +++ b/lint_function/camara-reserved-words.js @@ -0,0 +1,98 @@ +// CAMARA Project - support function for Spectral linter +// 31.01.2024 - initial version + +const reservedWords = [ + 'abstract', + 'apiclient', + 'apiexception', + 'apiresponse', + 'assert', + 'boolean', + 'break', + 'byte', + 'case', + 'catch', + 'char', + 'class', + 'configuration', + 'const', + 'continue', + 'do', + 'double', + 'else', + 'extends', + 'file', + 'final', + 'finally', + 'float', + 'for', + 'goto', + 'if', + 'implements', + 'import', + 'instanceof', + 'int', + 'interface', + 'list', + 'localdate', + 'localreturntype', + 'localtime', + 'localvaraccept', + 'localvaraccepts', + 'localvarauthnames', + 'localvarcollectionqueryparams', + 'localvarcontenttype', + 'localvarcontenttypes', + 'localvarcookieparams', + 'localvarformparams', + 'localvarheaderparams', + 'localvarpath', + 'localvarpostbody', + 'localvarqueryparams', + 'long', + 'native', + 'new', + 'null', + 'object', + 'offsetdatetime', + 'package', + 'private', + 'protected', + 'public', + 'return', + 'short', + 'static', + 'strictfp', + 'stringutil', + 'super', + 'switch', + 'synchronized', + 'this', + 'throw', + 'throws', + 'transient', + 'try', + 'void', + 'volatile', + 'while' +]; +// Reserved word 'enum' and 'default' are removed from above reserved word array as they are common in openAPI keyword +export default async function lintReservedWords(input) { + // Iterate over properties of the input object + for (const path in input) { + if (typeof path === 'string') { + + for (const word of reservedWords) { + const regex = new RegExp(`\\b${word}\\b`, 'g'); // Use a regular expression to match 'word' as a standalone word + + if (regex.test(path)) { + const warningRuleName = 'camara-reserved-words'; + const description = `Reserved words found in input: Consider avoiding the use of reserved word '${word}'`; + // const location = `${path}`; + + console.log(`warning ${warningRuleName} ${description} ${path}`); + } + } + } + } +} diff --git a/lint_function/camara-security-no-secrets-in-path-or-query-parameters.js b/lint_function/camara-security-no-secrets-in-path-or-query-parameters.js new file mode 100644 index 00000000..ebbff2a4 --- /dev/null +++ b/lint_function/camara-security-no-secrets-in-path-or-query-parameters.js @@ -0,0 +1,26 @@ +// CAMARA Project - support function for Spectral linter +// 31.01.2024 - initial version + +const sensitiveData = ['MSISDN','IMSI','phoneNumber']; + +export default async function (input) { + + // Iterate over properties of the input object + for (const path in input) { + + if (typeof path === 'string') { + for (const word of sensitiveData ) { + const regex = new RegExp(`\\b${word}\\b`, 'g'); // Use a regular expression to match 'word' as a standalone word + + if (regex.test(path)) { + + const warningRuleName = 'camara-security-no-secrets-in-path-or-query-parameters'; + const description = `sensitiveData Data found in path: Consider avoiding the use of sensitiveData data '${word}'`; + const location = `paths.${path}`; + console.log(`warning ${warningRuleName} ${description} ${location}`); + + } + } + } + } +}