Feature 11074: Enhanced OSM declarative modelling for applications. OSM's SDK for intent manipulation
Change-Id: I6d03faa143eafcf30380b3b854c54f177dcf8f25
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
diff --git a/docker/osm-nushell-krm-functions/operations/pattern.nu b/docker/osm-nushell-krm-functions/operations/pattern.nu
new file mode 100644
index 0000000..d59842e
--- /dev/null
+++ b/docker/osm-nushell-krm-functions/operations/pattern.nu
@@ -0,0 +1,83 @@
+#######################################################################################
+# 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.
+#######################################################################################
+
+# Module with custom functions to manage a Pattern definition, taking into account its corresponding source template and the set of transformations specified for its constituent Bricks.
+
+
+use ../krm *
+use ./replace.nu
+use ./location.nu
+use ./brick.nu
+
+# Generate a ResourceList based on a Pattern instance model received from stdin.
+#
+# Initially, the ResourceList will be generated from the templates at the `source` location (replacing environment variables as needed), and then the transformations indicated by the Bricks will be applied.
+export def create [
+ environment: record = {} # Record with environment variables to load
+]: [
+ record -> record
+] {
+ let in_pattern: record = $in
+
+ # Get the pattern name and its parameters
+ let pattern_name: string = ($in_pattern | get "name")
+ let pattern_params: record = (
+ $in_pattern
+ | get -i "parameters"
+ | default {}
+ # If applicable, update placeholder values at the custom environment parameters
+ | replace vars (
+ $environment
+ | upsert $.PATTERN_NAME $pattern_name
+ )
+ )
+
+ # Update the environment to include the pattern name
+ let updated_environment: record = (
+ $environment
+ | upsert $.PATTERN_NAME $pattern_name
+ | merge $pattern_params
+ )
+
+ # Update the pattern record accordingly
+ let updated_pattern: record = (
+ $in_pattern
+ | replace vars $updated_environment
+ )
+
+ # Get other key parts
+ let src: string = (
+ $updated_pattern
+ | get "source"
+ | location to absolute path
+ )
+ let bricks: list<record> = ($updated_pattern | get "bricks")
+
+ # Generate ResourceList from source template folder
+ let rl: record = (
+ convert folder to resourcelist $src
+ | replace vars $updated_environment
+ )
+
+ # Apply transformations according to the specified bricks
+ with-env $updated_environment {
+ $bricks
+ | reduce --fold $rl {|elt, acc|
+ $acc | brick transform $elt $updated_environment
+ }
+ }
+}