blob: 1f568f3f0b9d42bcb703969b376ce136d0558cba [file] [log] [blame]
#######################################################################################
# Copyright ETSI Contributors and Others.
#
# 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.
#######################################################################################
# Helper module to manage KSU source or target locations, so that they can be safely translated to well-known paths in the local filesystem.
# Helper function to convert a profile type name to the canonical name for that profile type so that it can build a folder path deterministically.
# NOT EXPORTED
def "normalize profile type" [
]: [
string -> string
] {
$in
| if $in in ["controller", "infra-controller", "infra-controllers", "infra_controller", "infra_controllers"] {
"infra-controller-profiles"
} else if $in in ["config", "infra-config", "infra-configs", "infra_config", "infra_configs"] {
"infra-config-profiles"
} else if $in in ["managed", "resources", "managed-resources", "managed_resources"] {
"managed-resources"
} else if $in in ["app", "apps", "applications", "cnf", "cnfs", "nf", "nfs"] {
"app-profiles"
} else {
$in
}
}
# Helper function to convert an OKA type name to the canonical name for that OKA type so that it can build a folder path deterministically.
# NOT EXPORTED
def "normalize oka type" [
]: [
string -> string
] {
$in
| if $in in ["controller", "infra-controller", "infra-controllers", "infra_controller", "infra_controllers"] {
"infra-controllers"
} else if $in in ["config", "infra-config", "infra-configs", "infra_config", "infra_configs"] {
"infra-configs"
} else if $in in ["managed", "resources", "managed-resources", "managed_resources", "cloud-resources", "cloud_resources"] {
"cloud-resources"
} else if $in in ["app", "apps", "applications", "cnf", "cnfs", "nf", "nfs"] {
"apps"
} else {
$in
}
}
# Convert a location into its components to determine a path in the local filesystem.
export def "to path components" [
default_project_name: string = "osm_admin" # Default project name
default_repos_base: string = "/repos" # Base path for the local repo clones
]: [
record -> list<path>
] {
let in_location: record = $in
# Absolute path of the local repo clone
let repo: string = (
$in_location
# Is it a path?
| if ($in | get -i "repo-path" | is-not-empty ) {
# $in_location
$in
| get "repo-path"
| path join
# Maybe it was specified by repo name?
} else if (
($in | get -i "repo-name" | is-not-empty )
) {
[
# ($in_location | get -i "repos-base" | default $default_repos_base),
# ($in_location | get "repo-name")
($in | get -i "repos-base" | default $default_repos_base),
($in | get "repo-name")
]
| path join
# Otherwise, throws an error
} else {
error make { msg: $"Error: Invalid location spec. Missing `repo-path` or `repo-name` key. Non conformant: \n($in_location | to yaml)"}
}
# Ensure that the absolute path starts by "/"
| if ($in | str starts-with "/") {
$in
} else {
$"/($in)"
}
)
# Get the base path prior to the last item (e.g., profile path or OKA folder)
let base: string = (
$in_location
# Is it a path?
| if ($in | get -i "base-path" | is-not-empty ) {
$in
| get "base-path"
| path join
# Maybe it is a profile spec?
} else if (
($in | get -i "profile-type" | is-not-empty ) and
($in | get -i "profile-name" | is-not-empty )
) {
[
($in | get -i "project-name" | default $default_project_name),
($in | get "profile-type" | normalize profile type),
($in | get "profile-name")
]
| path join
# Maybe it is an OKA subfolder spec?
} else if (
($in | get -i "oka-type" | is-not-empty ) and
($in | get -i "oka-name" | is-not-empty )
) {
[
($in | get "oka-type" | normalize oka type),
($in | get "oka-name")
]
| path join
# Otherwise, it is malformed
} else {
error make { msg: $"Error: Invalid location spec. Missing `base-path` or `profile-type`+`profile-name` or `oka-type`+`oka-name` key. Non conformant: \n($in | to yaml)"}
}
)
# Check that the final relative path is available
if ($in_location | get -i "relative-path" | is-empty ) {
error make { msg: $"Error: Invalid location spec. Missing `relative-path` key. Non conformant: \n($in_location | to yaml)"}
}
# Finally, return the path components
[ $repo, $base, ($in_location | get "relative-path" | path join) ]
}
# Convert a location to an absolute path in the local filesystem.
export def "to absolute path" [
default_project_name: string = "osm_admin" # Default project name
default_repos_base: string = "/repos" # Base path for the local repo clones
]: [
record -> path
] {
$in
| to path components $default_project_name $default_repos_base
| path join
}
# Convert a location to a relative path in the local filesystem with respect to the root of the locally cloned repo.
export def "from base path" [
default_project_name: string = "osm_admin" # Default project name
]: [
record -> path
] {
$in
| to path components $default_project_name
# Drop the first item (the `repo-path`)
| skip 1
| path join
}