diff --git a/doc/architecture/oauth.md b/doc/architecture/oauth.md index e7081a7b093089d61d972208a7230cb1ece642c3..193a6393c706ebc3868dde4be7f99ce0edfd9bc4 100644 --- a/doc/architecture/oauth.md +++ b/doc/architecture/oauth.md @@ -9,10 +9,12 @@ All APIs (except grant token request) must include Bearer token in request Autho ##OAuth token -Get first an oauth token, using your username and password. +Get first an oAauth token, using your username and password. + +> The URL `https://portal.openslice.eu` is used as an example, and needs to be changed accordingly. ```bash -curl -X POST http://portal.openslice.eu/auth/realms/openslice/protocol/openid-connect/token -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=demouser' -d 'password=demouser' -d 'grant_type=password' -d 'client_id=osapiWebClientId' +curl -X POST https://portal.openslice.eu/auth/realms/openslice/protocol/openid-connect/token -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=demouser' -d 'password=demouser' -d 'grant_type=password' -d 'client_id=osapiWebClientId' ``` Response: @@ -33,7 +35,7 @@ Response: The `access_token` will be used next as a Bearer. ```bash -curl http://portal.openslice.eu/tmf-api/serviceCatalogManagement/v4/serviceCatalog -H 'Authorization: Bearer {{access_token}} +curl https://portal.openslice.eu/tmf-api/serviceCatalogManagement/v4/serviceCatalog -H 'Authorization: Bearer {{access_token}} ``` Response: diff --git a/doc/architecture/tmfapi.md b/doc/architecture/tmfapi.md index 168efa29df14ac3c17a01f1e6b94c1801fef814c..d05e0709dd932c6a74d566f9a793325331ca4732 100644 --- a/doc/architecture/tmfapi.md +++ b/doc/architecture/tmfapi.md @@ -1,6 +1,6 @@ # TMF OpenAPI specification -PLease check the complete specification [here](http://portal.openslice.eu/tmf-api/swagger-ui/index.html). +PLease check the complete specification [here](https://portal.openslice.eu/tmf-api/swagger-ui/index.html). ## API interaction @@ -13,7 +13,7 @@ See [oauth](./oauth.md). Example: Get all Service Catalogs (check the `Authorization:Bearer` to be correct) ```bash -curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbIm9wZW5hcGkiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSJdLCJvcmdhbml6YXRpb24iOiJteW9yZ2FuaXp0aW9uIiwiZXhwIjoxNTc4NTA1MDcyLCJhdXRob3JpdGllcyI6WyJST0xFX01FTlRPUiIsIlJPTEVfQURNSU4iXSwianRpIjoiMTFlNGYxYTUtZDY0Ny00YzA1LWE0ZGMtYWFhYzUyMjk4YzMwIiwiY2xpZW50X2lkIjoib3NhcGlXZWJDbGllbnRJZE91dCJ9.gm7cKdusDrdMRkxEiFU5sENKGRC1xwVj2SgPRmE9xxx" -H "accept: application/json;charset=utf-8" -X GET "http://portal.openslice.eu/tmf-api/serviceCatalogManagement/v4/serviceCatalog" +curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbIm9wZW5hcGkiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSJdLCJvcmdhbml6YXRpb24iOiJteW9yZ2FuaXp0aW9uIiwiZXhwIjoxNTc4NTA1MDcyLCJhdXRob3JpdGllcyI6WyJST0xFX01FTlRPUiIsIlJPTEVfQURNSU4iXSwianRpIjoiMTFlNGYxYTUtZDY0Ny00YzA1LWE0ZGMtYWFhYzUyMjk4YzMwIiwiY2xpZW50X2lkIjoib3NhcGlXZWJDbGllbnRJZE91dCJ9.gm7cKdusDrdMRkxEiFU5sENKGRC1xwVj2SgPRmE9xxx" -H "accept: application/json;charset=utf-8" -X GET "https://portal.openslice.eu/tmf-api/serviceCatalogManagement/v4/serviceCatalog" ``` diff --git a/doc/getting_started/configuration/config_intro.md b/doc/getting_started/configuration/config_intro.md index 94fe71c9fa525f6c759fe4a424d1677276eb7842..f506badad0f5345115f783c2f33347fcd769ca2b 100644 --- a/doc/getting_started/configuration/config_intro.md +++ b/doc/getting_started/configuration/config_intro.md @@ -6,4 +6,4 @@ This section provides information on how to configure and manage different aspec * Manage user roles and access in Keycloak * Configure/Manage NFVOs -* Advanced configuration scenarios \ No newline at end of file +* Advanced configuration scenarios (e.g. external OSS federation) \ No newline at end of file diff --git a/doc/getting_started/configuration/consuming_services_from_external_partners.md b/doc/getting_started/configuration/consuming_services_from_external_partners.md index 128d1a26935c155e8a05351b53376d77bfb2ffbd..7f20ae180289386d83f5d7c57f8195c2ed447a00 100644 --- a/doc/getting_started/configuration/consuming_services_from_external_partners.md +++ b/doc/getting_started/configuration/consuming_services_from_external_partners.md @@ -1,52 +1,85 @@ # Consuming Services From External Partner Organizations -A typical deployment across domains, involves today some typical components: i) an OSS/BSS to allow customers access the service catalog and perform service orders, ii) a Service Orchestrator (SO) component for executing the service order workflow, as well as iii) a Network Functions Virtualization Orchestrator (NFVO) for configuring the iv) network resources. +**Intended Audience: OpenSlice Administrators** -TMF Open APIs are introduced not only for exposing catalogues and accepting service orders, but also implementing the East-West interfaces between the domains, fulfilling also the LSO requirements as introduced by MEF. +A typical deployment across domains, involves some typical components: -The following figure shows how openslice could be used in such scenarios: +1. an OSS/BSS to allow customers access the Service Catalog and perform Service Orders, +2. a Service Orchestrator (SO) component for executing the service order workflow +3. a Network Orchestrator (e.g. Kubernetes, NFVO) or respective Resource Controllers +4. configurable network Resources -![Openslice multi-domain-architecture](./images/multi-domain-architecture.png) +TMF Open APIs are primarily introduced for exposing Catalogues and accepting Service Orders, but also for implementing the East-West interfaces between the domains. + +The following figure shows how OpenClice could be used in such scenarios: +![Openslice multi-domain-architecture](./images/multi-domain-architecture.png) -In Openslice we can consume services from 3rd parties via Open APIs. -We use the TMF 632 Party Management model to specify Organizations that we can exchange items and other information such as: +In OpenSlice, we use the TMF 632 Party Management model to specify external partner Organizations. Once done, external Organizations can exchange items and other information such as: - Import Service Specifications - Create a Service Order - Use the Service Inventory to query the status of the service ordered to the external partner organization -## Define an Organization as 3rd party to consume services East-West +This functionality is not only limited between OpenSlice instances, but can be expanded to any external OSS that utilizes TMF v4 APIs. + +## Define an external partner Organization to consume services (East-West) + +To define an external partner Organization, the user must possess the "ADMIN" role. The Organization management can be executed at the Services or Products Portal, under the `Manage Entities -> Organizations` tab. + +When creating a new *federated* Organization, you must define an Organization Name and a Trading Name (optional). Once the Organization is created, you must define the necessary external Organization details as Characteristics for the synchronization process. + +By minimum, you must define the following Characteristics: + +- **EXTERNAL_TMFAPI_BASEURL**: The Organization's domain, e.g. https://portal.openslice.eu +- **EXTERNAL_TMFAPI_OAUTH2TOKENURI**: The endpoint to obtain the OAUTH2 token, e.g. https://portal.openslice.eu/auth/realms/openslice/protocol/openid-connect/token +- **EXTERNAL_TMFAPI_USERNAME**: The authentication credentials (username), e.g. admin +- **EXTERNAL_TMFAPI_PASSWORD**: The authentication credentials (password), e.g. openslice +- **EXTERNAL_TMFAPI_CLIENTREGISTRATIONID**: An Organization identifier to setup the OAUTH Client, e.g. authOpensliceProvider +- **EXTERNAL_TMFAPI_OAUTH2CLIENTID**: The OAUTH Client ID, e.g. osapiWebClientId +- **EXTERNAL_TMFAPI_OAUTH2CLIENTSECRET**: The OAUTH Client secret, e.g. secret +- **EXTERNAL_TMFAPI_OAUTH2SCOPES**: The OAUTH scopes (*must be ; separated - no space between*), e.g. admin;read + +> The above Characteristics define an external Organization registration, which can be validated through the `EXTERNAL_TMFAPI_STATUS` once the partner registration process happens (HH:00 and HH:30, each hour). A successful synchronization populates the Characteristic with a similar value `ISODATE: FULLSPECS SUCCESS`, else a `NOT CONFIGURED` value appears. + +**Important Note**: Although an external Organization is registered, you have to define which Service Characteristics shall be synchronized, so as for this process to make sense. Following, there are the available filtering option, all relative to the BASEURL: + +- **EXTERNAL_TMFAPI_SERVICE_CATALOG_URLS**: A filter of desired Service Specifications to be synced, e.g. /tmf-api/serviceCatalogManagement/v4/serviceSpecification?type=CustomerFacingServiceSpecification (synchronizes all CFSS). + +If not specified, it defaults to "/tmf-api/serviceCatalogManagement/v4/serviceSpecification", which synchronizes everything -An organization must have the following characteristics in openslice catalog, like for example: +**OR** -"EXTERNAL_TMFAPI_BASEURL", "http://portal.openslice.eu" +- **EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS**: A filter of desired Service Specifications within a Service Category, e.g. /tmf-api/serviceCatalogManagement/v4/serviceCategory/4136c0a2-1f6d-41e6-bb02-ae50c020925d (synchronizes all Service Specifications within the Service Category with the provided ID). -"EXTERNAL_TMFAPI_CLIENTREGISTRATIONID", "authOpensliceProvider" +Multiple Service Categories' links can be specified and must be comma-separated (,) - no space between. -"EXTERNAL_TMFAPI_OAUTH2CLIENTID", "osapiWebClientId" +Once the synchronization process is successful, the filtered Service Specifications will appear in your OpenSlice instance under the Service Specifications List (`Manage Service -> Service Specifications -> List Service Specification`). You can distinguish externally synchronized Service Specifications from their description, as illustrated in the following figure. -"EXTERNAL_TMFAPI_OAUTH2CLIENTSECRET", "secret" +You can now use the synchronized Service Specification into your Service bundle designs, which, when ordered, will delegate the instantiation to the the partner's Service Orchestrator, while also populating the initiator's Service Inventory. -"EXTERNAL_TMFAPI_OAUTH2SCOPES", scopes +![Synchronized Service Specifications](./images/synchronized_Service_Specifications.png) -"EXTERNAL_TMFAPI_OAUTH2TOKENURI", "http://portal.openslice.eu/osapi-oauth-server/oauth/token" -"EXTERNAL_TMFAPI_USERNAME", "admin" +As already introduced, this feature assumes that the partner OSS instance operates under TMF v4 APIs for Service Catalog and Ordering Management. -"EXTERNAL_TMFAPI_PASSWORD", "openslice" +Specifically, it assumes the following URLs (relative to BASEURL) to get Service Specifications' information and issue Service Orders, respectively: -"EXTERNAL_TMFAPI_SERVICE_CATALOG_URLS" = "/tmf-api/serviceCatalogManagement/v4/serviceSpecification?type=CustomerFacingServiceSpecification" (this is optional, fetch a list of service specs it will be relative with the BASEURL. If the url is empty then no specs will be fetched, the EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS might be used) +- /tmf-api/serviceCatalogManagement/v4/serviceSpecification +- /tmf-api/serviceOrdering/v4/serviceOrder -"EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS" = "/tmf-api/serviceCatalogManagement/v4/serviceCategory/{categoryid}" (this example will fetch all specs in a category. You may define comma separated URLs of categories API URL . This will fetch specifications of every defined category. If you want only one specific category put for example the uuid only of one category: "/tmf-api/serviceCatalogManagement/v4/serviceCategory/bda02821-bc4d-4bd6-b64b-d9c2aa5f8e6d". multiple urls should be "/tmf-api/serviceCatalogManagement/v4/serviceCategory/bda02821-bc4d-4bd6-b64b-d9c2aa5f8e6d,/tmf-api/serviceCatalogManagement/v4/serviceCategory/9b6d8bf3-abd2-43c4-8154-c8c6fe5545b2") +If a partner OSS instance is not following the above URLs, you may define custom ones during the partner Organization definition, populating the following characteristics: -"EXTERNAL_TMFAPI_SERVICE_SPEC" = "/tmf-api/serviceCatalogManagement/v4/serviceSpecification" +- **EXTERNAL_TMFAPI_SERVICE_SPEC**: The endpoint to get Service Specification information, e.g. /tmf/ServiceSpecification +- **EXTERNAL_TMFAPI_SERVICE_ORDER_URLS**: The endpoint to issue a partner Service Order, e.g. /tmf/ServiceOrder -"EXTERNAL_TMFAPI_SERVICE_ORDER_URLS"= "/test/v1/serviceorder" (this is optional) +## A JSON example of external partner Organization definition + -An example Organization defined example in json: +An example Organization defined as JSON: + ```json { "uuid": "1a09a8b5-6bd5-444b-b0b9-a73c69eb42ae", @@ -54,7 +87,7 @@ An example Organization defined example in json: "@schemaLocation": null, "@type": null, "href": null, - "name": "Openslice.io", + "name": "Portal External", "id": "1a09a8b5-6bd5-444b-b0b9-a73c69eb42ae", "isHeadOffice": null, "isLegalEntity": null, @@ -144,7 +177,7 @@ An example Organization defined example in json: "name": "EXTERNAL_TMFAPI_OAUTH2TOKENURI", "valueType": null, "value": { - "value": "http://portal.openslice.eu/osapi-oauth-server/oauth/token", + "value": "https://portal.openslice.eu/auth/realms/openslice/protocol/openid-connect/token", "alias": null } }, @@ -170,7 +203,20 @@ An example Organization defined example in json: "name": "EXTERNAL_TMFAPI_BASEURL", "valueType": null, "value": { - "value": "http://portal.openslice.eu", + "value": "https://portal.openslice.eu", + "alias": null + } + }, + { + "uuid": "be685fe0-60c6-4aeb-81ba-af9f2063659b", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS", + "valueType": null, + "value": { + "value": "/tmf-api/serviceCatalogManagement/v4/serviceCategory/ef2c90dd-b65e-4a9f-a9c3-427c9fb0219b", "alias": null } } @@ -180,5 +226,4 @@ An example Organization defined example in json: "taxExemptionCertificate": [] } -``` - \ No newline at end of file +``` \ No newline at end of file diff --git a/doc/getting_started/configuration/images/synchronized_Service_Specifications.png b/doc/getting_started/configuration/images/synchronized_Service_Specifications.png new file mode 100644 index 0000000000000000000000000000000000000000..8f88d183f29cbe33590892b85d5a2557ec8fd2d7 Binary files /dev/null and b/doc/getting_started/configuration/images/synchronized_Service_Specifications.png differ diff --git a/doc/getting_started/configuration/nfvo_config.md b/doc/getting_started/configuration/nfvo_config.md index 639df650ac8153a38371cb57cb2f3c74ab6bbb4c..dff334557f6fd40d6ff465031cfe61b183c7dc05 100644 --- a/doc/getting_started/configuration/nfvo_config.md +++ b/doc/getting_started/configuration/nfvo_config.md @@ -1,12 +1,17 @@ # NFV Orchestrator Configuration +**Intended Audience: OpenSlice Administrators** + + > Currently we support Open Source MANO version EIGHT/NINE/TEN/ELEVEN/THIRTEEN. Later versions of OSM may also be supported by the existing configuration, as from OSM 9+ the project converged to the SOL005 interface, regarding the NBI, and SOL006 (YANG model), regarding the NFV/NS packaging. Also an implementation of a generic SOL005 interface is supported, but not extensively tested. -Configuration of your target(s) NFVOs/MANO services with Openslice is performed through the NFV portal. +> **Important Note**: Although OSMvTHIRTEEN appears as an option, we have been notified that users have experienced some synchronization issues, when using it. For that reason, we strongly suggest to use OSMvELEVEN for every subsequent OSM version, until the issue is resolved. We have tested using OSMvELEVEN option until OSM Release SEVENTEEN. + +Configuration of your target(s) NFVOs/MANO services with OpenSlice is performed through the NFV portal. -1. Login to {{yourdomain}}/nfvportal/ +1. Login to `{domain_URL}/nfvportal/` -2. Navigate to Admin > Manage MANO Platforms > Add New MANO Platform, pick one of the supported MANO platform(s), e.g. Name=OSMvTHIRTEEN, Version=OSMvTHIRTEEN and save. You may edit the saved MANO platforms after this. +2. Navigate to Admin > Manage MANO Platforms > Add New MANO Platform, pick one of the supported MANO platform(s), e.g. Name=OSMvELEVEN, Version=OSMvELEVEN and save. You may edit the saved MANO platforms after this. 3. Navigate to Admin > Manage MANO providers > Add New MANO Provider and enter its details: diff --git a/doc/getting_started/configuration/role_keycloak_management.md b/doc/getting_started/configuration/role_keycloak_management.md index a7d6a1a39bd9ee02aaf1bc38741bb50512a1e587..4e59874d3f4449bbdd294f6ee21f55521eaf322a 100644 --- a/doc/getting_started/configuration/role_keycloak_management.md +++ b/doc/getting_started/configuration/role_keycloak_management.md @@ -2,10 +2,31 @@ **Intended Audience: OpenSlice Administrators** -Some initial configuration of Keycloak happens at Installation/Deployment time. Here are some notes regarding user management +Some initial configuration of Keycloak happens at Installation/Deployment time. The Keycloak admin user must create and manage OpenSlice users. -There are cases that OpenSlice administrators need to configure Keycloak: +By default, Keycloak is accessible via the `{domain_URL}/auth` path. -* Change user roles, e.g. make a Simple user a Service Designer -* Domain management +It is mandatory that an at least 1 "ADMIN" OpenSlice user exists at every instance. + +The ADMIN role is needed to: + +* Configure NFVO targets +* Enable NFV orchestration +* Manage Service Catalogs and Categories +* Design Service Specifications and manage their expose through Service Catalogs/Categories +* Acknowledge Service Orders for fulfillment +* Browse all Service Specifications, Orders, and Inventory +* Browse all Resource Specifications and Inventory + +Alternative, the USER role can be assigned so as to: + +* Access the marketplace +* Issue Service Orders +* Preview own Service Orders and Inventory + + +There are cases that OpenSlice/Keycloak administrators need to configure Keycloak, so as to: + +* Change user roles, e.g. make a Simple user (USER) a Service Designer (ADMIN) +* Domain management, e.g. Access Token lifespan, allowed Origins * User Password reset \ No newline at end of file diff --git a/doc/getting_started/deployment/docker_compose.md b/doc/getting_started/deployment/docker_compose.md index c4f609ef71d6230b54dd76d84be0a6bf7fe581e0..e3fe4581cf146ac5cd87a73e69688980b8b9a936 100644 --- a/doc/getting_started/deployment/docker_compose.md +++ b/doc/getting_started/deployment/docker_compose.md @@ -263,6 +263,37 @@ SPRING_APPLICATION_JSON: '{ }' ``` +### 8. Configure oslmcpbackend (MCP Backend Service) + +Change the respective fields: + +- To configure the Ollama LLM server URL and model. +- To customize the AI assistant's system prompt and temperature. +- If you made changes to keycloak credentials. +- If you want to change logging level (TRACE / DEBUG / INFO / WARN / ERROR). + +> ***If you are using a non-local domain, replace everywhere the http://keycloak:8080 with the respective {{protocol://domain.name}}.*** + +In folder `org.etsi.osl.main/compose/` edit the file `docker-compose.yaml` + +```yaml + # AI Configuration + SPRING_AI_OLLAMA_BASE_URL: http://ollama:11434 + SPRING_AI_OLLAMA_CHAT_MODEL: gpt-oss:20b + SPRING_AI_OLLAMA_CHAT_TEMPERATURE: 0.5 + SPRING_AI_CHAT_SYSTEM_PROMPT: "You are an OpenSlice AI Assistant." + SPRING_AI_CHAT_MAX_MESSAGES: 100 + + # OAuth2/Keycloak Configuration + SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: http://keycloak:8080/auth/realms/openslice + SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KEYCLOAK_ISSUER_URI: http://keycloak:8080/auth/realms/openslice + SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_CLIENT_ID: osapiWebClientId + + # Logging Configuration + LOGGING_LEVEL_ROOT: INFO + LOGGING_LEVEL_OSL: INFO + LOGGING_LEVEL_SPRING_AI: INFO +``` ## Configure nginx diff --git a/doc/getting_started/deployment/kubernetes.md b/doc/getting_started/deployment/kubernetes.md index 2f516d84795fc829b0167e075d7111e654c81a6b..596a886b622296980249af9035e49c12a41d8027 100644 --- a/doc/getting_started/deployment/kubernetes.md +++ b/doc/getting_started/deployment/kubernetes.md @@ -49,7 +49,7 @@ + kubernetes.io/ingress.global-static-ip-name: web-static-ip ``` - * **Other Ingress Controller:** For other ingress controllers, modify `[repo-root]/kubernetes/helm/openslice/templates/openslice-ingress.yaml` to meet your controller’s requirements. + * **Other Ingress Controller:** For other ingress controllers, modify `ingressClassName` in the `[repo-root]/kubernetes/helm/openslice/values.yaml`. In the rare occasion that the controller requires more configuration (e.g., see GKE above), you should modify the `[repo-root]/kubernetes/helm/openslice/templates/openslice-ingress.yaml` accordingly. ### Exposure @@ -239,9 +239,9 @@ Similarly, to configure CRIDGE, there are three different ways to provide this k > **Note:** Regardless of the method you choose, if you're using a non-standard kubeconfig file name, make sure to adjust the references or rename the file as needed. -> **Important Note:** If you are deploying CRIDGE in the same cluster and namespace as OpenSlice, no additional configuration is required for the message bus broker URL and OpenSlice communicates with CRIDGE directly. However, if CRIDGE is installed in a **separate Kubernetes cluster** from the one hosting OpenSlice, it is important to configure the `values.yaml` file for the CRIDGE Helm chart to point to the correct message bus broker URL. Please see [Nginx Ingress Controller (Kubernetes Community Edition) configuration](#software-requirements) on how to properly expose the message bus in such scenario. +> **Important Note:** If you are deploying **CRIDGE in the same cluster** and namespace as OpenSlice, no additional configuration is required for the message bus broker URL and OpenSlice communicates with CRIDGE directly (assuming the 61616 port remains unchanged). However, if CRIDGE is installed in a **separate Kubernetes cluster** from the one hosting OpenSlice, it is important to configure the `values.yaml` file for the CRIDGE Helm chart to point to the correct message bus broker URL. Please see [Nginx Ingress Controller (Kubernetes Community Edition) configuration](#software-requirements) on how to properly expose the message bus in such scenario. -In the `values.yaml` of the CRIDGE Helm chart, you must set `oscreds.activemq.brokerUrl` to point to the IP address of the ingress controller in the OpenSlice cluster, as shown below: +In the scenario of a publicly exposed message bus (separate Kubernetes cluster), in the `values.yaml` of the CRIDGE Helm chart, you must set `oscreds.activemq.brokerUrl` to point to the IP address of the ingress controller in the OpenSlice cluster, as shown below: ```yaml oscreds: @@ -255,6 +255,39 @@ OpenSlice also offers management support of *multiple Kubernetes Clusters* simul For this, you will have to replicate the steps in [Standalone CRIDGE deployment](#standalone-cridge-deployment) for every Cluster. Each CRIDGE instance will be in charged with the management of one Kubernetes Cluster. +### MCP Backend Service + +The MCP Backend Service provides AI-powered assistance using Ollama and connects to the OpenSlice MCP server. + +To configure the MCP Backend Service, update the following fields in the `values.yaml` file: + +```yaml +mcpbackend: + enabled: true + logLevelRoot: INFO + logLevelOSL: INFO + spring: + logLevel: INFO + ai: + ollama: + model: "gpt-oss:20b" # Change the used model here + temperature: 0.5 + apiUrl: "http://ollama:11434" # Change the Ollama API URL here + chat: + systemPrompt: "You are an OpenSlice AI Assistant." # Customize your initial Assistant prompt + maxMessages: 100 # Maximum number of messages to keep in context +``` + +**Key Configuration Fields:** + +- `mcpbackend.enabled`: Set to `true` to deploy the MCP Backend Service, `false` to disable it. +- `mcpbackend.spring.ai.ollama.apiUrl`: URL of your Ollama server. Update this if using an external Ollama instance. +- `mcpbackend.spring.ai.ollama.model`: The AI model to use (e.g., gpt-oss:20b, llama2, mistral). +- `mcpbackend.spring.ai.chat.systemPrompt`: Customize your initial Assistant prompt. +- `mcpbackend.spring.ai.ollama.temperature`: Controls randomness (0.0-1.0). Lower values are more deterministic. +- `mcpbackend.spring.ai.chat.maxMessages`: Maximum number of messages to keep in the conversation context. + +> **Note:** Ensure the Ollama server is running and the specified model is available before starting the service. ### External Services (optional) @@ -291,11 +324,13 @@ spring: To configure the ingress controller and root URL for OpenSlice, update the rooturl field with your ingress load balancer IP or domain. This setting is crucial for external access to your application: ```yaml -rooturl: "http://openslice.com" # Example domain +rooturl: "https://openslice.com" # Example domain # or rooturl: "http://3.15.198.35:8080" # Example IP with port ``` +Additionally, in the event of the non-default (nginx) ingress controller, you should change the `ingress.ingressClassName' property. + ### Persistent Volume for MySQL For persistent storage, especially for MySQL, define the storage size under the `mysql` section. This ensures that your database retains data across pod restarts and deployments. @@ -318,23 +353,19 @@ This setup ensures that the message bus service is accessible externally via the In folder `kubernetes/helm/openslice/files/org.etsi.osl.portal.web/src/js` you must make a copy of `config.js.default` file and rename it to `config.js`. +```bash +# Starting from the root project directory +cd kubernetes/helm/openslice/files/org.etsi.osl.portal.web/src/js +``` + +```bash +cp config.js.default config.js +``` + This is **mandatory** for the configuration file to be discoverable. Edit the `config.js` configuration file with your static configuration, if needed. -```js -{ - TITLE: "OpenSlice by ETSI", - WIKI: "https://osl.etsi.org/documentation/", - BUGZILLA: "{{ .Values.rooturl }}/bugzilla", - STATUS: "{{ .Values.rooturl }}/status", - APIURL: "{{ .Values.rooturl }}", - WEBURL: "{{ .Values.rooturl }}/nfvportal", - APIOAUTHURL: "{{ .Values.rooturl }}/auth/realms/openslice", - APITMFURL: "{{ .Values.rooturl }}/tmf-api/serviceCatalogManagement/v4" -} -``` - ### TMF Web UI @@ -359,54 +390,20 @@ Ensure that you check the `config.prod.json` and `theming.scss` files and readju cd kubernetes/helm/openslice/files/org.etsi.osl.tmf.web/src/assets/config ``` -E.g. You may edit "TITLE", "WIKI", etc properties with your domain title. Also configure TMF's API and Keycloak's location for the web application, if needed. - -```json -{ - "TITLE": "OpenSlice by ETSI", - "PORTALVERSION":"{{{ documentation_version }}}", - "WIKI": "https://osl.etsi.org/documentation", - "BUGZILLA": "{BASEURL}/bugzilla/", - "STATUS": "{BASEURL}/status/", - "WEBURL": "{BASEURL}", - "PORTAL_REPO_APIURL": "{BASEURL}/osapi", - "ASSURANCE_SERVICE_MGMT_APIURL": "{BASEURL}/oas-api", - "APITMFURL": "{BASEURL}/tmf-api", - "OAUTH_CONFIG" : { - "issuer": "{BASEURL}/auth/realms/openslice", - "loginUrl": "{BASEURL}/auth/realms/openslice/protocol/openid-connect/auth", - "tokenEndpoint": "{BASEURL}/auth/realms/openslice/protocol/openid-connect/token", - "userinfoEndpoint": "{BASEURL}/auth/realms/openslice/protocol/openid-connect/userinfo", - "redirectUri": "{BASEURL}/redirect", - "logoutUrl": "{BASEURL}/auth/realms/openslice/protocol/openid-connect/logout", - "postLogoutRedirectUri": "{BASEURL}", - - "responseType": "code", - "oidc": false, - "clientId": "osapiWebClientId", - "dummyClientSecret": "secret", - - "requireHttps": false, - "useHttpBasicAuth": true, - "clearHashAfterLogin": false, - - "showDebugInformation": true - } -} +```bash +cp config.prod.default.json config.prod.json +cp theming.default.scss theming.scss ``` -> The {BASEURL} placeholder in the file automatically detects the Origin (Protocol://Domain:Port) of the deployment and applies it to every respective property. E.g. If you are attempting a local deployment of OpenSlice, then {BASEURL} is automatically translated to "http://localhost". Similarly, you may use {BASEURL} to translate to a public deployment configuration, e.g. "https://portal.openslice.eu". -If further customization, apart from the default provided, is needed for branding (Logo, Footer) then `config.theming.json` needs to be created in kubernetes/helm/openslice/files/org.etsi.osl.tmf.web/src/assets/config directory, as follows: +E.g. You may edit the `config.prod.json`, changing "TITLE", "WIKI", etc properties with your domain title. Also configure TMF's API and Keycloak's location for the web application, if needed. + + +> In the `config.prod.json` file, the {BASEURL} placeholder in the file automatically detects the Origin (Protocol://Domain:Port) of the deployment and applies it to every respective property. E.g. If you are attempting a local deployment of OpenSlice, then {BASEURL} is automatically translated to "http://localhost". Similarly, you may use {BASEURL} to translate to a public deployment configuration, e.g. "https://portal.openslice.eu". + +If further customization, apart from the default provided, is needed for branding (Logo, Footer) then `config.theming.json` needs to be created in kubernetes/helm/openslice/files/org.etsi.osl.tmf.web/src/assets/config directory, copied from `config.theming.default.json`. -```bash -# Starting from the root project directory -cd kubernetes/helm/openslice/files/org.etsi.osl.tmf.web/src/assets/config -``` -```bash -sudo cp config.theming.default.json config.theming.json -``` ## Deploy the Helm Chart @@ -415,7 +412,7 @@ After configuring the services, and editing the `values.yaml` file accordingly, ```bash cd kubernetes/helm/openslice/ -helm install myopenslice . --namespace openslice --create-namespace +helm install openslice . --namespace openslice --create-namespace ``` ## Validating deployments and container monitoring @@ -431,58 +428,58 @@ To check the status of your deployment, use the following commands. The output s kubectl get pods -n openslice NAME READY UP-TO-DATE AVAILABLE AGE -myopenslice-artemis 1/1 1 1 6m28s -myopenslice-blockdiag 1/1 1 1 6m28s -myopenslice-bugzilla 1/1 1 1 6m28s -myopenslice-centrallog 1/1 1 1 6m28s -myopenslice-cridge 1/1 1 1 6m28s -myopenslice-keycloak 1/1 1 1 6m28s -myopenslice-kroki 1/1 1 1 6m28s -myopenslice-manoclient 1/1 1 1 6m28s -myopenslice-oasapi 1/1 1 1 6m28s -myopenslice-osom 1/1 1 1 6m28s -myopenslice-osportalapi 1/1 1 1 6m28s -myopenslice-osscapi 1/1 1 1 6m28s -myopenslice-portalweb 1/1 1 1 6m28s -myopenslice-tmfweb 1/1 1 1 6m28s +openslice-artemis 1/1 1 1 6m28s +openslice-blockdiag 1/1 1 1 6m28s +openslice-bugzilla 1/1 1 1 6m28s +openslice-centrallog 1/1 1 1 6m28s +openslice-cridge 1/1 1 1 6m28s +openslice-keycloak 1/1 1 1 6m28s +openslice-kroki 1/1 1 1 6m28s +openslice-manoclient 1/1 1 1 6m28s +openslice-oasapi 1/1 1 1 6m28s +openslice-osom 1/1 1 1 6m28s +openslice-osportalapi 1/1 1 1 6m28s +openslice-osscapi 1/1 1 1 6m28s +openslice-portalweb 1/1 1 1 6m28s +openslice-tmfweb 1/1 1 1 6m28s ``` ```bash kubectl get deployments -n openslice NAME READY UP-TO-DATE AVAILABLE AGE -myopenslice-artemis 1/1 1 1 7m17s -myopenslice-blockdiag 1/1 1 1 7m17s -myopenslice-bugzilla 1/1 1 1 7m17s -myopenslice-centrallog 1/1 1 1 7m17s -myopenslice-cridge 1/1 1 1 7m17s -myopenslice-keycloak 1/1 1 1 7m17s -myopenslice-kroki 1/1 1 1 7m17s -myopenslice-manoclient 1/1 1 1 7m17s -myopenslice-oasapi 1/1 1 1 7m17s -myopenslice-osom 1/1 1 1 7m17s -myopenslice-osportalapi 1/1 1 1 7m17s -myopenslice-osscapi 1/1 1 1 7m17s -myopenslice-portalweb 1/1 1 1 7m17s -myopenslice-tmfweb 1/1 1 1 7m17s +openslice-artemis 1/1 1 1 7m17s +openslice-blockdiag 1/1 1 1 7m17s +openslice-bugzilla 1/1 1 1 7m17s +openslice-centrallog 1/1 1 1 7m17s +openslice-cridge 1/1 1 1 7m17s +openslice-keycloak 1/1 1 1 7m17s +openslice-kroki 1/1 1 1 7m17s +openslice-manoclient 1/1 1 1 7m17s +openslice-oasapi 1/1 1 1 7m17s +openslice-osom 1/1 1 1 7m17s +openslice-osportalapi 1/1 1 1 7m17s +openslice-osscapi 1/1 1 1 7m17s +openslice-portalweb 1/1 1 1 7m17s +openslice-tmfweb 1/1 1 1 7m17s ``` ```bash kubectl get services -n openslice NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -myopenslice-artemis ClusterIP 10.101.128.223 8161/TCP,61616/TCP,61613/TCP 7m43s -myopenslice-blockdiag ClusterIP 10.109.196.90 8001/TCP 7m43s -myopenslice-bugzilla ClusterIP 10.107.10.101 13010/TCP 7m43s -myopenslice-centrallog ClusterIP 10.109.84.33 13013/TCP 7m43s -myopenslice-keycloak ClusterIP 10.104.172.73 8080/TCP,8443/TCP 7m43s -myopenslice-kroki ClusterIP 10.106.92.111 8000/TCP 7m43s -myopenslice-manoclient ClusterIP 10.100.143.154 13011/TCP 7m43s -myopenslice-mysql ClusterIP 10.108.206.75 3306/TCP 7m43s -myopenslice-oasapi ClusterIP 10.100.107.66 13101/TCP 7m43s -myopenslice-osom ClusterIP 10.97.88.133 13100/TCP 7m43s -myopenslice-osportalapi ClusterIP 10.111.212.76 13000/TCP 7m43s -myopenslice-osscapi ClusterIP 10.101.84.220 13082/TCP 7m43s -myopenslice-portalweb ClusterIP 10.101.16.112 80/TCP 7m43s -myopenslice-tmfweb ClusterIP 10.101.157.185 80/TCP 7m43s +openslice-artemis ClusterIP 10.101.128.223 8161/TCP,61616/TCP,61613/TCP 7m43s +openslice-blockdiag ClusterIP 10.109.196.90 8001/TCP 7m43s +openslice-bugzilla ClusterIP 10.107.10.101 13010/TCP 7m43s +openslice-centrallog ClusterIP 10.109.84.33 13013/TCP 7m43s +openslice-keycloak ClusterIP 10.104.172.73 8080/TCP,8443/TCP 7m43s +openslice-kroki ClusterIP 10.106.92.111 8000/TCP 7m43s +openslice-manoclient ClusterIP 10.100.143.154 13011/TCP 7m43s +openslice-mysql ClusterIP 10.108.206.75 3306/TCP 7m43s +openslice-oasapi ClusterIP 10.100.107.66 13101/TCP 7m43s +openslice-osom ClusterIP 10.97.88.133 13100/TCP 7m43s +openslice-osportalapi ClusterIP 10.111.212.76 13000/TCP 7m43s +openslice-osscapi ClusterIP 10.101.84.220 13082/TCP 7m43s +openslice-portalweb ClusterIP 10.101.16.112 80/TCP 7m43s +openslice-tmfweb ClusterIP 10.101.157.185 80/TCP 7m43s ``` ### Accessing Logs for Troubleshooting diff --git a/doc/getting_started/portals.md b/doc/getting_started/portals.md index f118b49ac4a846ffbf7195a936c8d93c1bd7caf5..246b579cebfb91075641cc24814b52838fba4222 100644 --- a/doc/getting_started/portals.md +++ b/doc/getting_started/portals.md @@ -1,12 +1,12 @@ # OpenSlice Portals -OpenSlice comprises of a web landing page (See [Demo](http://portal.openslice.eu/)) that navigates to the respective Portals: +OpenSlice comprises of a web landing page (See [Demo](https://portal.openslice.eu/)) that navigates to the respective Portals: -- Services Portal (See [Demo](http://portal.openslice.eu/services)) -- NFV Portal (See [Demo](http://portal.openslice.eu/nfvportal)) -- Products Portal (See [Demo](http://portal.openslice.eu/products)) -- Testing Portal (See [Demo](http://portal.openslice.eu/testing)) -- Resources Portal (See [Demo](http://portal.openslice.eu/resources)) +- Services Portal (See [Demo](https://portal.openslice.eu/services)) +- NFV Portal (See [Demo](https://portal.openslice.eu/nfvportal)) +- Products Portal (See [Demo](https://portal.openslice.eu/products)) +- Testing Portal (See [Demo](https://portal.openslice.eu/testing)) +- Resources Portal (See [Demo](https://portal.openslice.eu/resources)) Following you may find the scope each portal focuses on and the main TMF APIs it supports: diff --git a/doc/index.md b/doc/index.md index f2f32772fbbb9790f2e646dde31e50b69eaf6777..deec19be3e5bfc2f678424e2343ab41d3e36b878 100644 --- a/doc/index.md +++ b/doc/index.md @@ -73,9 +73,9 @@ There are various portals offering UI friendly access to users acting as Service Check a live demo of OpenSlice in the following pages: -* OpenSlice demo: -* OpenSlice Service Catalogs and ordering: -* OpenSlice NFV Services onboarding: +* OpenSlice demo: +* OpenSlice Service Catalogs and ordering: +* OpenSlice NFV Services onboarding: Login credentials: diff --git a/doc/naas/nfv/nfvservices.md b/doc/naas/nfv/nfvservices.md index 963023c0b66aa2ebcdf07fc3410b6f0a13f75ddd..f4529ff02ad74811e43cc97cc34c098f8df857df 100644 --- a/doc/naas/nfv/nfvservices.md +++ b/doc/naas/nfv/nfvservices.md @@ -1,6 +1,6 @@ # NFV Services -NFV Services are managed through a dedicated UI, i.e. the NFV portal (eg., [http://portal.openslice.eu/nfvportal](http://portal.openslice.eu/nfvportal)). +NFV Services are managed through a dedicated UI, i.e. the NFV portal (eg., [https://portal.openslice.eu/nfvportal](https://portal.openslice.eu/nfvportal)). Users are able through this portal to manage their NFV artifacts towards the NFVO (for example onboard VNFs and NSDs to a target OSM). diff --git a/doc/naas/service_catalog.md b/doc/naas/service_catalog.md index 56a4694d88eb06d54e87fa29fdd5c7e5ee93d422..c7e15f4c3b253b035b723f78b85bfd7ae99c2ef6 100644 --- a/doc/naas/service_catalog.md +++ b/doc/naas/service_catalog.md @@ -44,5 +44,5 @@ Scenario: A service provider wants to offer a new managed XXXX service to enterp ## Probe further * Read the model of Service Catalogs in TMF [TMF633 Service Catalog API User Guide v4.0.0](https://www.tmforum.org/resources/specification/tmf633-service-catalog-api-user-guide-v4-0-0/) -* Check a demo of the API [here](http://portal.openslice.eu/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0) -* Check a demo of the Catalog and Categories [here](http://portal.openslice.eu) \ No newline at end of file +* Check a demo of the API [here](https://portal.openslice.eu/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0) +* Check a demo of the Catalog and Categories [here](https://portal.openslice.eu) \ No newline at end of file diff --git a/doc/naas/service_inventory.md b/doc/naas/service_inventory.md index 51c63a52e5cd739b313f3d691281e2ecbf733e75..305bec1ea345ffec4dc6423305d0e715e201d93a 100644 --- a/doc/naas/service_inventory.md +++ b/doc/naas/service_inventory.md @@ -29,6 +29,7 @@ endpoint examples: ## Probe further -* See [Ordering Services from catalogs](../service_ordering/ordering_services.md) +* See [Ordering Services from catalogs](../service_ordering/ordering_services_ui.md) +* See [Ordering Service via the API](../service_ordering/ordering_services_api.md) * See [Service Design](../service_design/intro.md) diff --git a/doc/naas/service_ordering.md b/doc/naas/service_ordering.md index 48c40d2e05c3ebacea168f05f5a2f35a250ca7a0..9fa9971a33f78e3b7c7ab140b047258ceb0bbf88 100644 --- a/doc/naas/service_ordering.md +++ b/doc/naas/service_ordering.md @@ -38,5 +38,6 @@ endpoint examples: ## Probe further -* See [Ordering Services from catalogs](../service_ordering/ordering_services.md) +* See [Ordering Services from catalogs](../service_ordering/ordering_services_ui.md) +* See [Ordering Service via the API](../service_ordering/ordering_services_api.md) * See [Service Design](../service_design/intro.md) \ No newline at end of file diff --git a/doc/naas/service_spec.md b/doc/naas/service_spec.md index 50a2b7449baa21d57d2a8d1654118db9252f03e2..ce24c5223b768b6f1f9a9889421d9a8e40de017f 100644 --- a/doc/naas/service_spec.md +++ b/doc/naas/service_spec.md @@ -65,6 +65,6 @@ Scenario: A service provider wants to offer a new managed XXXX service to enterp ## Probe further * Read the model of Service Catalogs in TMF [TMF633 Service Catalog API User Guide v4.0.0](https://www.tmforum.org/resources/specification/tmf633-service-catalog-api-user-guide-v4-0-0/) -* Check a demo of the API [here](http://portal.openslice.eu/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0) -* Check a demo of the Service Specifications in Catalog and Categories [here](http://portal.openslice.eu) (You need to login - see main guide page) +* Check a demo of the API [here](https://portal.openslice.eu/tmf-api/swagger-ui/index.html?urls.primaryName=tmf-api-633-ServiceCatalogManagement-v4.0.0) +* Check a demo of the Service Specifications in Catalog and Categories [here](https://portal.openslice.eu) (You need to login - see main guide page) * Check the GSMA GST \ No newline at end of file diff --git a/doc/service_design/examples/jenkins_helm_install_aas/jenkins_helm_install_aas.md b/doc/service_design/examples/jenkins_helm_install_aas/jenkins_helm_install_aas.md index 34710dfa9f9d40385d13e69b1240b48747f7598d..9972776be4c50195681c91ed43a232a93764d519 100644 --- a/doc/service_design/examples/jenkins_helm_install_aas/jenkins_helm_install_aas.md +++ b/doc/service_design/examples/jenkins_helm_install_aas/jenkins_helm_install_aas.md @@ -27,10 +27,14 @@ In ArgoCD, the field **status.health.status** has the value that we need to chec Also, the different ArgoCD lifycycle states must be captured by the respective **_CR_CHECKVAL_xxx** characteristics, as show in the figure below: +> To populate the characteristics, we click the edit characteristic button and input the appropriate value into the service characteristic value field. + ![img05.png](./img05.png) -After the state mapping, we must provide the template that ArgoCD will use to deploy the Jenkins HELM Chart as an ArgoCD application. For this, we must populate the **_CR_SPEC** characteristic. The _CR_SPEC can be designed first in a YAML or json editor for better parsing. +After the state mapping, we must provide the template that ArgoCD will use to deploy the Jenkins HELM Chart as an ArgoCD application. For this, we must populate the **_CR_SPEC** characteristic. The _CR_SPEC can be designed first in a YAML or JSON editor for better parsing. + +It is highly recommended to avoid populating the **_CR_SPEC** characteristic with the above procedure (directly pasting the value), as the following process (via simple LCM rule) is extremely more modular. Let's see a YAML definition: @@ -55,6 +59,7 @@ spec: values: | controller: serviceType: ClusterIP + installLatestPlugins: false persistence: enabled: false syncPolicy: @@ -105,13 +110,13 @@ The LCM rule can be created from the "Life Cycle Rules" tab, pressing the "Creat Let's create it step-by-step: -1. Drag-Drop the _CR_SPEC block (Set characteristic value) of jenkinsrfs from the Service > Text blocks -2. Drag-Drop the Text > Formatted text block and attach it after the block from the previous step -3. Drag-Drop the Text > Multi-line text input block and attach it at the Input(String) connector of the block from the previous text -4. Copy paste the previously provided YAML text -5. Change the spec:destination:namespace property to the value %s -6. Drag-Drop the Lists > Create list block, delete the 2 extra items (click the gear icon). Attach it at the Variables(Array) connector of the formatted text block from the previous step. -7. Drag-Drop the Service > Context > Current Service Order block and select the ID from the drop-down menu. Attach it to the List block of the previous step. +1. Drag-Drop the **_CR_SPEC block (Set characteristic value)** of jenkinsrfs from the **Service > Text blocks** +2. Drag-Drop the **Text > Formatted text block** and attach it after the block from the previous step +3. Drag-Drop the **Text > Multi-line text input block** and attach it at the **Input(String) connector** of the block from the previous text +4. Copy paste the previously **provided YAML text** +5. Change the **spec:destination:namespace property** to the value **%s** +6. Drag-Drop the **Lists > Create list block**, delete the 2 extra items (click the gear icon). Attach it at the **Variables(Array) connector** of the formatted text block from the previous step. +7. Drag-Drop the **Service > Context > Current Service Order block** and **select the ID** from the drop-down menu. Attach it to the List block of the previous step. 8. Save the PRE_PROVISION Rule ## Expose the Jenkins (Customer-Facing) Service to the users diff --git a/doc/service_design/examples/monitoring_aas/images/MetricoCFSSpecificationCharacteristics_v1_0.png b/doc/service_design/examples/monitoring_aas/images/MetricoCFSSpecificationCharacteristics_v1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a53938b7f3e07b85ee4a015f45608a2f02293e51 Binary files /dev/null and b/doc/service_design/examples/monitoring_aas/images/MetricoCFSSpecificationCharacteristics_v1_0.png differ diff --git a/doc/service_design/examples/monitoring_aas/images/MetricoCFSSpecificationLCM_v1_0.png b/doc/service_design/examples/monitoring_aas/images/MetricoCFSSpecificationLCM_v1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..8345cec9426ba7592651ad415cda8946c535be83 Binary files /dev/null and b/doc/service_design/examples/monitoring_aas/images/MetricoCFSSpecificationLCM_v1_0.png differ diff --git a/doc/service_design/examples/monitoring_aas/images/ServiceOrderCheckout_v1_0.png b/doc/service_design/examples/monitoring_aas/images/ServiceOrderCheckout_v1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..28f5ab94dda6058a6635d205d59605b205b3dca6 Binary files /dev/null and b/doc/service_design/examples/monitoring_aas/images/ServiceOrderCheckout_v1_0.png differ diff --git a/doc/service_design/examples/monitoring_aas/images/edit_cfs_service_characteristic_v_1_0.png b/doc/service_design/examples/monitoring_aas/images/edit_cfs_service_characteristic_v_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..73b838c53d55f3950a2b5d4c7ff0a883ee6ff9db Binary files /dev/null and b/doc/service_design/examples/monitoring_aas/images/edit_cfs_service_characteristic_v_1_0.png differ diff --git a/doc/service_design/examples/monitoring_aas/monitoring_aas.md b/doc/service_design/examples/monitoring_aas/monitoring_aas.md index 639959ce706c16a407e659645a760de6bfb18152..241320c27e54af72e7c4c62e8fa299fc36d85bd4 100644 --- a/doc/service_design/examples/monitoring_aas/monitoring_aas.md +++ b/doc/service_design/examples/monitoring_aas/monitoring_aas.md @@ -27,8 +27,6 @@ For reference, the available Characteristics are: - **_MT_URL**: The monitoring source URL (e.g. https://prom.osl.etsi.org:9090) - **_MT_QUERY**: The query towards the monitoring source (e.g. query=gnb_service_state) - **_MT_RECURRING_INTERVAL**: The polling interval of the monitoring source (default value: G_1MN, Available values: G_10SEC, G_30SEC, G_1MN, G_5MN, G_15MN, G_30MN, G_1H, G_24H, G_1M, G_1Y) -- **_MT_START_TIME**: The starting time of the monitoring job (default value, if left blank: NOW) -- **_MT_END_TIME**: The ending time of the monitoring job (default value, if left blank: NOW + 1h) - **_MT_SERVICEUUID**: The ID of the service to update with the retrieved monitoring data - **_MT_CHARACTERISTIC_NAME**: The characteristic of the service with id _MT_SERVICEUUID that will be updated with the retrieved monitoring data @@ -64,7 +62,7 @@ Using "Create New Characteristic" menu, create the Characteristics as shown belo After filling all the Characteristics, you should be able to see something like the image below: -![METRICO CFSS Characteristics](./images/metrico_cfss_characteristics.png) +![METRICO CFSS Characteristics](./images/MetricoCFSSpecificationCharacteristics_v1_0.png) The above configuration is expected to query ```http://172.16.10.100:9090/api/v1/query?query=gnb_service_state&time=1736528808.484``` every 1 minute and return the result to the service that the user will point out (filling ```_MT_SERVICEUUID ```), and especially into a Characteristic named ```METRICO Result```. @@ -72,7 +70,7 @@ In our presented example, we would like the monitoring service to wait for user To achieve the above, you should navigate to the "Life Cycle Rules" tab and create a Creation Rule that will prevent the Metrico RFS from starting, unless the ```_MT_SERVICEUUID``` is provided. Also, you have to pass the updated user-defined Characteristics from the current to the Metrico RFS, when the previous condition is met. To do so, the rule has to be as the following: -![METRICO CFSS Creation Rule](./images/metrico_cfss_creation_rule.png) +![METRICO CFSS Creation Rule](./images/MetricoCFSSpecificationLCM_v1_0.png) Let's create it step-by-step: @@ -84,7 +82,7 @@ Let's create it step-by-step: - At the second slot, attach sequentially a) the Not and b) the String Comparison blocks (from Logic blocks) - The Comparison block must compare the "consumingServiceId" variable value (From Text blocks) and an empty line of text (From Text blocks) - At the final slot, attach the Create list block (from Lists blocks) -- From the last block's gear button, drag-and-drop more items in the list (must be 8, as the Characteristics) +- From the last block's gear button, drag-and-drop more items in the list (must be 6, as the Characteristics) - At each list item, attach the Set values to characteristics of a referenced service block (Service > Relationships > Service Refs blocks) - Each block must have the RFS's Characteristic Name (fill it in at a line of text block) and the respective Tvalue from the Get Value as String block (from Service > Characteristics blocks) - Repeat for every characteristic, as shown above @@ -101,7 +99,7 @@ Order the service from the previously assigned Service Catalog > Service Categor Here, we assume that the user will not provide the ```_MT_SERVICEUUID``` during the Service Order Checkout phase, neither the task's interval (which defaults to 1 hour). Note how the values are filled in with the defaults from the designing phase. -![Metrico CFSS Order Checkout](./images/metrico_cfss_order_checkout.png) +![Metrico CFSS Order Checkout](./images/ServiceOrderCheckout_v1_0.png) Once ordered, you may navigate to the Order Preview by Manage Services > Service Orders list. @@ -119,7 +117,7 @@ Starting from the Service Order overview and specifically the Order Item #1 tab Navigate to the "Service Characteristics" tab and click the edit Service Characteristics button. Provide the ID of the Metrico Service (as found in the address bar), at the ```_MT_SERVICEUUID``` value, as depicted in the figure below. -![Edit Metrico CFS Service Characteristic "_MT_SERVICEUUID"](./images/edit_cfs_service_characteristic.png) +![Edit Metrico CFS Service Characteristic "_MT_SERVICEUUID"](./images/edit_cfs_service_characteristic_v_1_0.png) Once the ```_MT_SERVICEUUID``` value is provided, the Metrico RFS will be created and eventually the Service Order will become "COMPLETED", as seen in the Service Order overview. diff --git a/doc/service_design/monitoring/design_monitoring_services.md b/doc/service_design/monitoring/design_monitoring_services.md index 2aacd078df181411dc903d65acaa5fc091b15013..a8f76d2f2cfd001fbabdb51afd582df35e449bc1 100644 --- a/doc/service_design/monitoring/design_monitoring_services.md +++ b/doc/service_design/monitoring/design_monitoring_services.md @@ -8,11 +8,11 @@ This section introduces a way to design Service Specifications that integrate ex When METRICO component instantiates, it automatically creates a respective Resource Specification, named ```METRICO_Resource_Specification```. It is always noted with a specific ```Version``` and ```Category```. As METRICO evolves, this combination shall change. METRICO creates its versioned Resource Specification, only when it is not already existing. -![METRICO Resource Specification](./images/MetricoResourceSpecification.png) +![METRICO Resource Specification](./images/MetricoResourceSpecification_v1_0.png) The Resource Specification comprises of all the properties needed to execute a monitoring job towards an external source and return the data to a candidate service. For this reason, it incorporates the respective characteristics, as shown below: -![METRICO Resource Specification's Characteristics](./images/MetricoResourceSpecificationCharacteristics.png) +![METRICO Resource Specification's Characteristics](./images/MetricoResourceSpecificationCharacteristics_v1_0.png) Namely, the characteristics provide the following information: @@ -20,8 +20,6 @@ Namely, the characteristics provide the following information: - **_MT_URL**: The monitoring source URL (e.g. https://prom.osl.etsi.org:9090) - **_MT_QUERY**: The query towards the monitoring source (e.g. query=gnb_service_state) - **_MT_RECURRING_INTERVAL**: The polling interval of the monitoring source (default value: G_1MN, Available values: G_10SEC, G_30SEC, G_1MN, G_5MN, G_15MN, G_30MN, G_1H, G_24H, G_1M, G_1Y) -- **_MT_START_TIME**: The starting time of the monitoring job (default value, if left blank: NOW) -- **_MT_END_TIME**: The ending time of the monitoring job (default value, if left blank: NOW + 1h) - **_MT_SERVICEUUID**: The ID of the service to update with the retrieved monitoring data - **_MT_CHARACTERISTIC_NAME**: The characteristic of the service with id _MT_SERVICEUUID that will be updated with the retrieved monitoring data diff --git a/doc/service_design/monitoring/images/MetricoResourceSpecificationCharacteristics_v1_0.png b/doc/service_design/monitoring/images/MetricoResourceSpecificationCharacteristics_v1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4fb90a3f8275705acc58c0809ea01dbb54c2aa Binary files /dev/null and b/doc/service_design/monitoring/images/MetricoResourceSpecificationCharacteristics_v1_0.png differ diff --git a/doc/service_design/monitoring/images/MetricoResourceSpecification_v1_0.png b/doc/service_design/monitoring/images/MetricoResourceSpecification_v1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fed6a3818ed03db3f5e9f6dd34aa3859335d7d8c Binary files /dev/null and b/doc/service_design/monitoring/images/MetricoResourceSpecification_v1_0.png differ diff --git a/doc/service_ordering/ordering_services_api.md b/doc/service_ordering/ordering_services_api.md new file mode 100644 index 0000000000000000000000000000000000000000..fbacb535e0f537c84b59bcb520af88f70d9685c8 --- /dev/null +++ b/doc/service_ordering/ordering_services_api.md @@ -0,0 +1,522 @@ +# Service Ordering Using the API + +**Intended Audience: OpenSlice Users** + +Having covered how OpenSlice can facilitate the Service Design and exposure, this section introduces the process of ordering the designed Service Specifications and their fulfillment process. + +To that extend, we assume that the OpenSlice Service Designers have already created the designated, detailed Service Specifications that are willing to expose to the OpenSlice users, or to potential Communication Service Customers (CSCs). Furthermore, the designed Service Specifications are categorized in the respective Service Categories and Catalogs. + +## Service Order UI vs API + +While the **Service Portal UI** guides users through a visual step-by-step wizard, the **Service Order API** is designed for speed and automation. + +The primary difference lies in discovery: + +- **UI Users**: Are guided by menus and visual categories to find what they need. + +- **API Users**: Are expected to know the specific Service Specification they intend to order before hitting the endpoint. + +Not sure which ID to use? +If you are integrating a new service and don't have the specification details yet, you can use the discovery flow to programmatically find the right specifications: + +1) **Query Service Catalogs**: Retrieve the high-level list of available catalogs. + +2) **Filter by Category**: Narrow down the functional area (e.g., "Cloud Connectivity" or "Security"). + +3) **Identify the Specification**: Extract the unique ID and requirements for your desired service. + +## The Anatomy of a Service Order API call + +To successfully place an order via API, your `POST` request must contain the "essence" of the service. At a minimum, your payload should include: + +| Attribute | Requirement | Description | +|-----------|-------------|-------------| +| Service Specification ID | Required | The unique UUID of the Service Specification. | +| Name | Required | A human-readable label for the specific service instance. | +| Characteristics | Optional | Key-value pairs for configurable traits (e.g., bandwidth: 100Mbps). | + + + +## Issue a Service Order + + +### Prerequisites + +- **Authentication**: You must include a valid Bearer Token in the header. See the [OAuth Setup Guide](../architecture/oauth.md). +- **Service Specification ID**: You should have the Service Specification ID ready. If you don't have it, query the Service Catalog first. + +### Endpoint Details + +- **Method**: `POST` +- **Endpoint**: `{URL}/tmf-api/serviceOrdering/v4/serviceOrder` +- **Headers**: `Authorization: Bearer {{access_token}}` + +### Request Payload Breakdown + +The payload defines what is being ordered, how it is configured, and when it should be active. + +An example: + +```json +{ + "orderItem": [ + { + "service": { + "serviceSpecification": { + "id": "dcbc9ed6-bf01-41cc-9c0c-3fe4e2788a77", + "name": "5G Connectivity and Internet Access" + }, + "serviceCharacteristic": [ + { + "name": "5G Radio Nodes", + "valueType": "SET", + "value": { + "value": "[{\"value\":\"outdoor\",\"alias\":\"Outdoor Radio Units\"}]" + } + }, + { + "name": "MCC", + "valueType": "TEXT", + "value": { + "value": "001", + "alias": "" + } + }, + { + "name": "MNC", + "valueType": "TEXT", + "value": { + "value": "01", + "alias": null + } + }, + { + "name": "TAC", + "valueType": "TEXT", + "value": { + "value": "100", + "alias": null + } + }, + { + "name": "RAN Profile", + "valueType": "ENUM", + "value": { + "value": "1", + "alias": "Default" + } + } + ] + }, + "action": "add", + "state": "ACKNOWLEDGED" + } + ], + "requestedStartDate": "2026-01-01T09:00:00.000Z", + "requestedCompletionDate": "2026-01-02T09:00:00.000Z" +} +``` + +Payload breakdown: + +- `serviceSpecification.id`: The unique identifier for the Service Specification. +- `serviceSpecification.name`: The human-readable name of the specification. +- `service.serviceCharacteristics`: **(Optional)** An array with optional configurable characteristics for your service + - `valueType`: Defines the data format (e.g., SET, TEXT, ENUM). + - `value.value`: The desired value of the characteristic. + > For types SET or ARRAY, the value property must be a stringified JSON object. Ensure you escape quotes correctly as shown in the example. + - `value.alias`: **(Optional)** Used to provide a user-friendly name in the UI +- `service.action`: Set to "add" for all new service provisions. +- `service.state`: Controls the automation workflow. + - **ACKNOWLEDGED**: Fully automated. Fulfillment begins immediately. + - **INITIAL**: Manual intervention required. An operator (Admin User) must confirm the order in OpenSlice, setting it to "ACKNOWLEDGED". +- `service.requestedStartDate`: When the service should be provisioned (ISO 8601). +- `service.requestedCompletionDate`: When the service should be automatically decommissioned (Teardown). +> If you use a past date, the service will decommission right after deployment. Ensure the proper provision of dates. + + +## Service Order Request Response + +The above request, will return a respective response: + +```json +{ + "uuid": "2121a09c-0de1-4854-aa7e-d7deb5571c1c", + "orderDate": "2026-01-01T08:00:00.000Z", + "completionDate": null, + "expectedCompletionDate": "2026-01-02T09:00:00.000Z", + "requestedCompletionDate": "2026-01-02T09:00:00.000Z", + "requestedStartDate": "2026-01-01T09:00:00.000Z", + "startDate": "2026-01-01T09:00:00.000Z", + "@baseType": "BaseRootEntity", + "@schemaLocation": null, + "@type": "ServiceOrder", + "href": null, + "id": "2121a09c-0de1-4854-aa7e-d7deb5571c1c", + "category": null, + "description": null, + "externalId": null, + "notificationContact": null, + "priority": null, + "note": [ + { + "uuid": "4621cb9a-b0d3-469a-b903-701f41ed1b0d", + "date": "2023-07-21T13:19:20.877630603Z", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "author": "SO641API-addServiceOrder", + "system": null, + "text": "Service Order INITIAL" + } + ], + "orderItem": [ + { + "uuid": "0745fd3d-5f6a-4118-ad54-fadad111ca47", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "id": "0745fd3d-5f6a-4118-ad54-fadad111ca47", + "action": "add", + "orderItemRelationship": [], + "state": "ACKNOWLEDGED", + "service": { + "uuid": "bc474ff9-d838-42be-9431-a25e1ab78b1b", + "serviceSpecification": { + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "5G Connectivity and Internet Access", + "version": "0.1.0", + "targetServiceSchema": null, + "@referredType": null, + "id": "dcbc9ed6-bf01-41cc-9c0c-3fe4e2788a77" + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "5G Connectivity and Internet Access", + "id": "bc474ff9-d838-42be-9431-a25e1ab78b1b", + "category": null, + "serviceType": null, + "place": [], + "relatedParty": [], + "serviceCharacteristic": [ + { + "uuid": "bd2c34ff-604a-49e8-adfc-5f4dc8b9f57e", + "value": { + "value": "[{\"value\":\"outdoor\",\"alias\":\"Outdoor Radio Units\"}]", + "alias": null + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "5G Radio Nodes", + "valueType": "SET" + }, + { + "uuid": "d90f4e4e-f924-4421-8363-24f30dfa225b", + "value": { + "value": "01", + "alias": null + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "MNC", + "valueType": "TEXT" + }, + { + "uuid": "5dac7869-8a63-409e-9dad-f331a4f0e3ce", + "value": { + "value": "100", + "alias": null + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "TAC", + "valueType": "TEXT" + }, + { + "uuid": "ff0b5e52-49c3-4ba3-ba69-aa985054ea6b", + "value": { + "value": "001", + "alias": "" + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "MCC", + "valueType": "TEXT" + }, + { + "uuid": "4q0bqd52-41c3-4vf3-bn69-cc99805e4a6m", + "value": { + "value": "1", + "alias": "Default" + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "RAN Profile", + "valueType": "ENUM" + } + ], + "state": "feasibilityChecked", + "supportingResource": [], + "serviceRelationship": [], + "supportingService": [] + }, + "appointment": null + } + ], + "orderRelationship": [], + "relatedParty": [ + { + "uuid": "136bf8a0-946c-4213-b39a-0a35b3b61eb5", + "@baseType": "BaseRootEntity", + "@schemaLocation": null, + "@type": "io.openslice.tmf.prm669.model.RelatedParty", + "href": null, + "name": "admin", + "role": "REQUESTER", + "@referredType": "SimpleUsername_Individual", + "id": "admin", + "extendedInfo": "admin@osl.org" + } + ], + "state": "ACKNOWLEDGED" +} +``` + +## Service Order Preview + +After submitting a POST request, the work moves to the background. You can track the progress and eventually retrieve your active service details using the Order ID. + +To monitor the progress of your order, use the GET method on the specific resource: + +- **Method**: `GET` +- **Endpoint**: `{URL}/tmf-api/serviceOrdering/v4/serviceOrder/{id}` +- **Headers**: `Authorization: Bearer {{access_token}}` + + +*Best Practice*: Implement a polling mechanism (callback interval) in your external system. Continue querying until the state attribute transitions to "COMPLETED". + + +```json +... +"orderItem": [ + { + "uuid": "0745fd3d-5f6a-4118-ad54-fadad111ca47", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "id": "0745fd3d-5f6a-4118-ad54-fadad111ca47", + "action": "add", + "orderItemRelationship": [], + "state": "COMPLETED", + "service": { + "uuid": "bc474ff9-d838-42be-9431-a25e1ab78b1b", + "serviceSpecification": { + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "5G Connectivity and Internet Access", + "version": "0.1.0", + "targetServiceSchema": null, + "@referredType": null, + "id": "dcbc9ed6-bf01-41cc-9c0c-3fe4e2788a77" + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "5G Connectivity and Internet Access", + "id": "bc474ff9-d838-42be-9431-a25e1ab78b1b", + "category": null, + "serviceType": null, + "place": [], + "relatedParty": [], + "serviceCharacteristic": [ + { + "uuid": "bd2c34ff-604a-49e8-adfc-5f4dc8b9f57e", + "value": { + "value": "[{\"value\":\"outdoor\",\"alias\":\"Outdoor Radio Units\"}]", + "alias": null + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "5G Radio Nodes", + "valueType": "SET" + }, + { + "uuid": "d90f4e4e-f924-4421-8363-24f30dfa225b", + "value": { + "value": "01", + "alias": null + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "MNC", + "valueType": "TEXT" + }, + { + "uuid": "5dac7869-8a63-409e-9dad-f331a4f0e3ce", + "value": { + "value": "100", + "alias": null + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "TAC", + "valueType": "TEXT" + }, + { + "uuid": "ff0b5e52-49c3-4ba3-ba69-aa985054ea6b", + "value": { + "value": "001", + "alias": "" + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "MCC", + "valueType": "TEXT" + }, + { + "uuid": "4q0bqd52-41c3-4vf3-bn69-cc99805e4a6m", + "value": { + "value": "1", + "alias": "Default" + }, + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "RAN Profile", + "valueType": "ENUM" + } + ], + "state": "active", + "supportingResource": [], + "serviceRelationship": [], + "supportingService": [ + { + "uuid": "7b90b9f3-0793-4bd1-9113-4ffeae67bfd4", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "5G Connectivity and Internet Access", + "id": "8f223f7c-0252-453f-bcad-c6e44c6dc6f0", + "@referredType": "5G Connectivity and Internet Access" + }, + { + "uuid": "96815cc1-87b4-4bf9-8191-8b95d927d0e7", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "open5gs-core_ns@OSM TEN", + "id": "e95413fc-5ff9-4199-848f-6e60cdf71d53", + "@referredType": "open5gs-core_ns@OSM TEN" + }, + { + "uuid": "98100115-30b7-4fc6-b8a5-32dea123b00b", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "open5gs-upf_ns@OSM TEN", + "id": "93bc84d2-392b-4cab-9429-5a285547fa00", + "@referredType": "open5gs-upf_ns@OSM TEN" + } + ] + }, + "appointment": null + } + ], +"state": "COMPLETED" +... +``` + +## Retrieving Active Service Instances + +Once the state is COMPLETED, the fulfillment process has successfully provisioned your resources. You can find the links to your live Services within the order response. + +Look for the supportingService array. This contains the references to the actual Service instances running in the environment. + +In the example provided, you may find this array at **orderItem[0].service.supportingService**, since the Service Order contains 1 Order item, hence the *[0]*. + +```json +{ + "supportingService": [ + { + "uuid": "7b90b9f3-0793-4bd1-9113-4ffeae67bfd4", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "5G Connectivity and Internet Access", + "id": "8f223f7c-0252-453f-bcad-c6e44c6dc6f0", + "@referredType": "5G Connectivity and Internet Access" + }, + { + "uuid": "96815cc1-87b4-4bf9-8191-8b95d927d0e7", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "open5gs-core_ns@OSM TEN", + "id": "e95413fc-5ff9-4199-848f-6e60cdf71d53", + "@referredType": "open5gs-core_ns@OSM TEN" + }, + { + "uuid": "98100115-30b7-4fc6-b8a5-32dea123b00b", + "@baseType": "BaseEntity", + "@schemaLocation": null, + "@type": null, + "href": null, + "name": "open5gs-upf_ns@OSM TEN", + "id": "93bc84d2-392b-4cab-9429-5a285547fa00", + "@referredType": "open5gs-upf_ns@OSM TEN" + } + ] +} +``` + +To retrieve the full details of an active Service, use the id found in the supportingService array from the previous step. + +- **Method**: `GET` +- **Endpoint**: `{URL}/tmf-api/serviceInventory/v4/service/{id}` +- **Headers**: `Authorization: Bearer {{access_token}}` + + +## Service/Service Order Termination + +In a dynamic environment, you may need to modify a running Service/Service Order or decommission it ahead of schedule. Since OpenSlice uses a declarative approach, you manage the Service/Service Order's life by updating its state or timeframe. + +The most efficient way to terminate a Service/Service Order and release its resources is to trigger the automatic orchestration logic. + +- **Identify**: Locate the existing Service Order ID. +- **Update**: Issue a PATCH to the Service Order. +- **Trigger**: Set the **requestedCompletionDate** to a past date (e.g., 2010-01-01T00:00:00.000Z). \ No newline at end of file diff --git a/doc/service_ordering/ordering_services.md b/doc/service_ordering/ordering_services_ui.md similarity index 99% rename from doc/service_ordering/ordering_services.md rename to doc/service_ordering/ordering_services_ui.md index 57f95211b6ee66091c61dc926c2ec6e0334e1d38..c8c3ba91a6701704104e4173a941ab850d7738e2 100644 --- a/doc/service_ordering/ordering_services.md +++ b/doc/service_ordering/ordering_services_ui.md @@ -1,4 +1,4 @@ -# Service Ordering +# Service Ordering Using the UI **Intended Audience: OpenSlice Users** diff --git a/mkdocs.yml b/mkdocs.yml index bf62343a08251085971e9d22611bd7d9798f1152..bfc704449b8a9e4457fc625bc68868d7e7a22147 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -83,7 +83,7 @@ plugins: variable_start_string: '{{{' variable_end_string: '}}}' # Copyright -copyright: "Copyright © 2025 ETSI OSL" +copyright: "Copyright © 2026 ETSI OSL" # Options extra: @@ -100,7 +100,7 @@ extra: link: https://twitter.com/OpensliceOSS version: provider: mike - documentation_version: "2025Q2" + documentation_version: "develop" # Page tree nav: @@ -168,7 +168,9 @@ nav: - Jenkins Helm Installation aaS : ./service_design/examples/jenkins_helm_install_aas/jenkins_helm_install_aas.md - Monitoring aaS: ./service_design/examples/monitoring_aas/monitoring_aas.md - Service Ordering: - - Ordering Services from Catalogs: ./service_ordering/ordering_services.md + - Ordering Services from Catalogs (UI): ./service_ordering/ordering_services_ui.md + - Ordering Services (API): ./service_ordering/ordering_services_api.md + # - Testing services: # - Testing Specification: ./testing_services/test_spec.md # - Testing Catalogs: ./testing_services/test_catalogs.md