diff --git a/.classpath b/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..3bc452ee9e9d1755c11e3e7c24e3ceeaa9a6c4da --- /dev/null +++ b/.classpath @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c4dfa5834b68221ea9fec623b9a7f05a9dfe1e4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/classes/ +/target +/.settings + +.project +.classpath + diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..3d872f628da12898f872b41465d9794dfc5c0684 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,35 @@ +include: + - project: osl/code/org.etsi.osl.main + ref: main + file: + - ci-templates/default.yml + - ci-templates/build.yml + rules: + - if: '$CI_COMMIT_REF_NAME == "main"' + + - project: osl/code/org.etsi.osl.main + ref: develop + file: + - ci-templates/default.yml + - ci-templates/build.yml + rules: + - if: '$CI_COMMIT_REF_NAME == "develop"' + + - project: osl/code/org.etsi.osl.main + ref: $CI_COMMIT_REF_NAME + file: + - ci-templates/default.yml + - ci-templates/build.yml + rules: + - if: '$CI_COMMIT_REF_PROTECTED && $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop"' + + - project: osl/code/org.etsi.osl.main + ref: develop + file: + - ci-templates/default.yml + - ci-templates/build_unprotected.yml + rules: + - if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop" && !$CI_COMMIT_REF_PROTECTED' + +maven_build: + extends: .maven_build diff --git a/.project b/.project new file mode 100644 index 0000000000000000000000000000000000000000..a6e6159ac10890258362a26296e9792a866a1368 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + org.etsi.osl.model.k8s + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000000000000000000000000000000000..18308defdbd17a8bd5837fef98d92d04e0014ed4 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=utf-8 +encoding//src/main/resources=utf-8 +encoding//src/test/java=utf-8 +encoding//src/test/resources=utf-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..cf2cd4590a7b37a700141633a3f00c030130be1e --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..f897a7f1cb2389f85fe6381425d29f0a9866fb65 --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/ci_settings.xml b/ci_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..69ad06ed6c63795d191555afde6ea2d1da4e133d --- /dev/null +++ b/ci_settings.xml @@ -0,0 +1,16 @@ + + + + gitlab-maven + + + + Job-Token + ${CI_JOB_TOKEN} + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e5f80ab7c186f8b0cd7ee020e743801e1cb83a4 --- /dev/null +++ b/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + + org.etsi.osl + org.etsi.osl.main + 1.0.0 + ../org.etsi.osl.main + + + + org.etsi.osl.model.k8s + + + + UTF-8 + UTF-8 + 1.18.28 + + + + + gitlab-maven + https://labs.etsi.org/rep/api/v4/groups/260/-/packages/maven + + + + + gitlab-maven + ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven + + + gitlab-maven + ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven + + + + + + + org.projectlombok + lombok + provided + ${lombok-version} + + + org.etsi.osl + org.etsi.osl.model.tmf + ${org.etsi.osl.model.tmf.version} + + + \ No newline at end of file diff --git a/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRDProperty.java b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRDProperty.java new file mode 100644 index 0000000000000000000000000000000000000000..f67d484e478e0892441a40cbd97a286e01d72c91 --- /dev/null +++ b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRDProperty.java @@ -0,0 +1,35 @@ +package org.etsi.osl.domain.model.kubernetes; + +import java.util.HashMap; +import java.util.Map; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ctranoris + */ +@Getter +@Setter +@Builder +public class KubernetesCRDProperty { + + String name; + String valueType; + String defaultValue; + String description; + Map properties; + + public Map getProperties() { + if ( properties == null) { + this.properties = new HashMap<>(); + } + return properties; + } + + + + + +} diff --git a/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRDV1.java b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRDV1.java new file mode 100644 index 0000000000000000000000000000000000000000..35d639254707f6c06c56ea4ee81595e4d559f6ed --- /dev/null +++ b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRDV1.java @@ -0,0 +1,248 @@ +package org.etsi.osl.domain.model.kubernetes; + +import java.util.HashMap; +import java.util.Map; +import org.etsi.osl.domain.model.DomainModelDefinition; +import org.etsi.osl.domain.model.ITMFRCM634_ModelTransformer; +import org.etsi.osl.domain.model.ITMFRI639_ModelTransformer; +import org.etsi.osl.tmf.common.model.ELifecycle; +import org.etsi.osl.tmf.common.model.EValueType; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationUpdate; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceOperationalStateType; +import org.etsi.osl.tmf.ri639.model.ResourceStatusType; +import org.etsi.osl.tmf.ri639.model.ResourceUpdate; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ctranoris + */ +@Getter +@Setter +public class KubernetesCRDV1 extends DomainModelDefinition + implements ITMFRCM634_ModelTransformer, ITMFRI639_ModelTransformer { + + public static final String OSL_KUBCRD_RSPEC_NAME = "kubernetes-crd.openslice.io"; + public static final String OSL_KUBCRD_RSPEC_VERSION = "0.0.3"; + public static final String OSL_KUBCRD_RSPEC_CATEGORY = "KubernetesCRD-apiextensions.k8s.io/v1"; + public static final String OSL_KUBCRD_RESOURCE_CATEGORY = "KubernetesCRD-apiextensions.k8s.io/v1"; + public static final String OSL_KUBCRD_RSPEC_TYPE = "LogicalResourceSpecification"; + public static final String OSL_KUBCRD_RSPEC_DESCRIPTION = "This Specification is used to describe a generic KubernetesCRD"; + + private String osl_KUBCRD_RSPEC_UUID = null; //this is assigned by the system through the DB for a specific instance + + private String clusterMasterURL; + private String currentContextCluster; + private String fullResourceName; + private String kind; + private String apiGroup; + private String UID; + private String metadata; + private String yaml; + private String json; + private Map properties; + private Map additionalProperties; + private String cr_spec; + private String statusCheckFieldName; + private String statusCheckValueStandby; + private String statusCheckValueAlarm; + private String statusCheckValueAvailable; + private String statusCheckValueReserved; + private String statusCheckValueUnknown; + private String statusCheckValueSuspended; + + + @Builder + public KubernetesCRDV1(String osl_KUBCRD_RSPEC_UUID, String uuid, String name, String version, String description, String category, + String clusterMasterURL, String currentContextCluster, String fullResourceName, + String kind, String apiGroup, String uID, + String metadata, + String yaml, + String json) { + super(uuid, name, version, description, category); + this.osl_KUBCRD_RSPEC_UUID = osl_KUBCRD_RSPEC_UUID; + this.clusterMasterURL = clusterMasterURL; + this.currentContextCluster = currentContextCluster; + this.fullResourceName = fullResourceName; + this.kind = kind; + this.apiGroup = apiGroup; + this.UID = uID; + this.metadata = metadata; + this.yaml = yaml; + this.json = json; + this.properties = new HashMap<>(); + this.additionalProperties = new HashMap<>(); + } + + + + @Override + public ResourceSpecificationCreate toRSpecCreate_InitRepo() { + + ResourceSpecificationCreate rsc = this.toRSpecCreate(); + rsc.setName( OSL_KUBCRD_RSPEC_NAME ); + rsc.setCategory( OSL_KUBCRD_RSPEC_CATEGORY ); + rsc.setVersion(OSL_KUBCRD_RSPEC_VERSION); + rsc.setDescription( OSL_KUBCRD_RSPEC_DESCRIPTION ); + rsc.setType( OSL_KUBCRD_RSPEC_TYPE ); + + + + return rsc; + } + + @Override + public ResourceSpecificationCreate toRSpecCreate() { + + ResourceSpecificationCreate rsc = new ResourceSpecificationCreate(); + rsc.setName( this.name ); + rsc.setCategory( OSL_KUBCRD_RSPEC_CATEGORY ); + rsc.setVersion( this.version ); + rsc.setDescription( this.version ); + rsc.setType( OSL_KUBCRD_RSPEC_TYPE ); + + rsc.setLifecycleStatus( ELifecycle.ACTIVE.getValue() ); + rsc.addResourceSpecificationCharacteristicItemShort("clusterMasterURL", this.clusterMasterURL, EValueType.TEXT.getValue(), "URL of cluster", false); + rsc.addResourceSpecificationCharacteristicItemShort("currentContextCluster", this.currentContextCluster, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("fullResourceName", this.fullResourceName, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("Kind", this.kind, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("apiGroup", this.apiGroup, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("UID", this.UID, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("metadata", this.metadata, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("yaml", this.yaml, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("json", this.json, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_SPEC", "", EValueType.TEXT.getValue(), "Used for providing the json Custom Resource description to apply", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_SPEC_LASTSEND", "", EValueType.TEXT.getValue(), "Used for providing the last description send", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_SPEC_APPLIED", "", EValueType.TEXT.getValue(), "Used for providing the json Custom Resource description as applied by Kubernetes", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECK_FIELD", "", EValueType.TEXT.getValue(), "Used for providing the field that need to be checked for the resource status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_STANDBY", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the standby status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_ALARM", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the alarm status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_AVAILABLE", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the available status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_RESERVED", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the reserved status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_UNKNOWN", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the unknown status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_SUSPENDED", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the suspended status", false); + +// rsc.addResourceSpecificationCharacteristicItemShort( "properties", "", EValueType.SET.getValue()); +// rsc.addResourceSpecificationCharacteristicItemShort( "additionalProperties", "", EValueType.SET.getValue()); + if (this.properties != null) + this.properties.forEach((kPropName, vProVal) -> { + + EValueType etype; + if ( vProVal.getValueType().equalsIgnoreCase("boolean")) { + etype = EValueType.BOOLEAN; + } else if ( vProVal.getValueType().equalsIgnoreCase("integer")) { + etype = EValueType.INTEGER; + } else if ( vProVal.getValueType().equalsIgnoreCase("object")) { + etype = EValueType.OBJECT; + } else + etype = EValueType.TEXT; + + rsc.addResourceSpecificationCharacteristicItemShort(kPropName , vProVal.getDefaultValue(), etype.getValue(), vProVal.getDescription(), false); + + }); + + if (this.additionalProperties != null ) { + this.additionalProperties.forEach((kPropName, vProVal) -> { + rsc.addResourceSpecificationCharacteristicItemShort("additionalProperty." + kPropName, vProVal.getDefaultValue(), EValueType.TEXT.getValue(), vProVal.getDescription(), false); + + }); + } + + return rsc; + } + + @Override + public ResourceSpecificationUpdate toRSpecUpdate() { + return this.toRSpecCreate(); + } + + @Override + public KubernetesCRDV1 fromRSpec(ResourceSpecification rSpec) { + this.osl_KUBCRD_RSPEC_UUID = rSpec.getUuid(); + return this; + } + + @Override + public ResourceCreate toResourceCreate() { + + if (osl_KUBCRD_RSPEC_UUID == null) { + return null; + } + + ResourceSpecificationRef rSpecRef = new ResourceSpecificationRef(); + rSpecRef.setId( osl_KUBCRD_RSPEC_UUID ); + rSpecRef.setName( OSL_KUBCRD_RSPEC_NAME ); + rSpecRef.setVersion( OSL_KUBCRD_RSPEC_VERSION ); + + ResourceCreate rs = new ResourceCreate(); + rs.name( this.name ) + .category( OSL_KUBCRD_RESOURCE_CATEGORY ) + .description( this.description ) + .resourceStatus( ResourceStatusType.AVAILABLE ) + .operationalState( ResourceOperationalStateType.ENABLE ) + .resourceSpecification( rSpecRef ) + .resourceVersion( this.version); + + rs.addResourceCharacteristicItemShort("clusterMasterURL", this.clusterMasterURL, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("currentContextCluster", this.currentContextCluster, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("fullResourceName", this.fullResourceName, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("Kind", this.kind, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("apiGroup", this.apiGroup, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("UID", this.UID, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("metadata", this.metadata, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("yaml", this.yaml, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("json", this.json, EValueType.TEXT.getValue()); + + rs.addResourceCharacteristicItemShort("_CR_SPEC", this.cr_spec, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_SPEC_LASTSEND", this.cr_spec, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_SPEC_APPLIED", "", EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECK_FIELD", this.statusCheckFieldName, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_STANDBY", this.statusCheckValueStandby, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_ALARM", this.statusCheckValueAlarm, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_AVAILABLE", this.statusCheckValueAvailable, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_RESERVED", this.statusCheckValueReserved, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_UNKNOWN", this.statusCheckValueUnknown, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_SUSPENDED", this.statusCheckValueSuspended, EValueType.TEXT.getValue()); + + + + if (this.properties != null) + this.properties.forEach((kPropName, vProVal) -> { + + EValueType etype; + if ( vProVal.getValueType().equalsIgnoreCase("boolean")) { + etype = EValueType.BOOLEAN; + } else if ( vProVal.getValueType().equalsIgnoreCase("integer")) { + etype = EValueType.INTEGER; + } else if ( vProVal.getValueType().equalsIgnoreCase("object")) { + etype = EValueType.OBJECT; + } else + etype = EValueType.TEXT; + + rs.addResourceCharacteristicItemShort(kPropName , "", etype.getValue()); + + }); + + if (this.additionalProperties != null ) { + this.additionalProperties.forEach((kPropName, vProVal) -> { + rs.addResourceCharacteristicItemShort("additionalProperty." + kPropName, "", EValueType.TEXT.getValue()); + + }); + } + + + return rs; + } + + @Override + public ResourceUpdate toResourceUpdate() { + + return this.toResourceCreate(); + } + +} diff --git a/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRV1.java b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRV1.java new file mode 100644 index 0000000000000000000000000000000000000000..c550be833d14a3d6276b1d33a51f44cf88fc4847 --- /dev/null +++ b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesCRV1.java @@ -0,0 +1,220 @@ +package org.etsi.osl.domain.model.kubernetes; + +import java.util.HashMap; +import java.util.Map; +import org.etsi.osl.domain.model.DomainModelDefinition; +import org.etsi.osl.domain.model.ITMFRCM634_ModelTransformer; +import org.etsi.osl.domain.model.ITMFRI639_ModelTransformer; +import org.etsi.osl.tmf.common.model.ELifecycle; +import org.etsi.osl.tmf.common.model.EValueType; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationUpdate; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceOperationalStateType; +import org.etsi.osl.tmf.ri639.model.ResourceStatusType; +import org.etsi.osl.tmf.ri639.model.ResourceUpdate; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ctranoris + */ +@Getter +@Setter +public class KubernetesCRV1 extends DomainModelDefinition + implements ITMFRCM634_ModelTransformer, ITMFRI639_ModelTransformer { + + public static final String OSL_KUBCRV1_RSPEC_NAME = "kubernetes-cr-v1.openslice.io"; + public static final String OSL_KUBCRV1_RSPEC_VERSION = "0.0.4"; + public static final String OSL_KUBCRV1_RSPEC_CATEGORY = "KubernetesCRV1-apiextensions.k8s.io/v1"; + public static final String OSL_KUBCRV1_RSPEC_TYPE = "LogicalResourceSpecification"; + public static final String OSL_KUBCRV1_RSPEC_DESCRIPTION = "This Specification is used to describe a generic KubernetesCRV1"; + + private String osl_KUBCRV1_RSPEC_UUID = null; //this is assigned by the system through the DB for a specific instance + + private String clusterMasterURL; + private String currentContextCluster; + private String fullResourceName; + private String kind; + private String apiGroup; + private String namespace; + private String UID; + private String metadata; + private String yaml; + private String json; + private Map properties; + private Map additionalProperties; + private String cr_spec_applied; + private String statusCheckFieldName; + private String statusCheckValueStandby; + private String statusCheckValueAlarm; + private String statusCheckValueAvailable; + private String statusCheckValueReserved; + private String statusCheckValueUnknown; + private String statusCheckValueSuspended; + private ResourceStatusType statusValue; + + @Builder + public KubernetesCRV1(String osl_KUBCRV1_RSPEC_UUID, String uuid, String name, String version, String description, String category, + String clusterMasterURL, String currentContextCluster, String fullResourceName, String namespace, + String kind, String apiGroup, String uID, String metadata, ResourceStatusType statusValue, + String yaml, + String json) { + super(uuid, name, version, description, category); + this.osl_KUBCRV1_RSPEC_UUID = osl_KUBCRV1_RSPEC_UUID; + this.clusterMasterURL = clusterMasterURL; + this.currentContextCluster = currentContextCluster; + this.fullResourceName = fullResourceName; + this.kind = kind; + this.apiGroup = apiGroup; + this.namespace = namespace; + this.UID = uID; + this.metadata = metadata; + this.yaml = yaml; + this.json = json; + this.statusValue = statusValue; + this.properties = new HashMap<>(); + this.additionalProperties = new HashMap<>(); + } + + + + @Override + public ResourceSpecificationCreate toRSpecCreate_InitRepo() { + + ResourceSpecificationCreate rsc = toRSpecCreate(); + rsc.setName( OSL_KUBCRV1_RSPEC_NAME ); + rsc.setCategory( OSL_KUBCRV1_RSPEC_CATEGORY ); + rsc.setVersion(OSL_KUBCRV1_RSPEC_VERSION); + rsc.setDescription( OSL_KUBCRV1_RSPEC_DESCRIPTION ); + rsc.setType( OSL_KUBCRV1_RSPEC_TYPE ); + + return rsc; + } + + + @Override + public ResourceSpecificationCreate toRSpecCreate() { + + ResourceSpecificationCreate rsc = new ResourceSpecificationCreate(); + rsc.setName( this.name ); + rsc.setCategory( OSL_KUBCRV1_RSPEC_CATEGORY ); + rsc.setVersion(this.version); + rsc.setDescription( this.description ); + rsc.setType( OSL_KUBCRV1_RSPEC_TYPE ); + + rsc.setLifecycleStatus( ELifecycle.ACTIVE.getValue() ); + rsc.addResourceSpecificationCharacteristicItemShort( "clusterMasterURL", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "currentContextCluster", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "fullResourceName", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "Kind", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "apiGroup", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "UID", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "namespace", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "metadata", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "yaml", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "json", "", EValueType.TEXT.getValue(), "", false); + + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_SPEC", "", EValueType.TEXT.getValue(), "Used for providing the json Custom Resource description to apply", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_SPEC_LASTSEND", "", EValueType.TEXT.getValue(), "Used for providing the last description send", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_SPEC_APPLIED", "", EValueType.TEXT.getValue(), "Used for providing the json Custom Resource description as applied by Kubernetes", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECK_FIELD", "", EValueType.TEXT.getValue(), "Used for providing the field that need to be checked for the resource status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_STANDBY", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the standby status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_ALARM", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the alarm status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_AVAILABLE", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the available status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_RESERVED", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the reserved status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_UNKNOWN", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the unknown status", false); + rsc.addResourceSpecificationCharacteristicItemShort( "_CR_CHECKVAL_SUSPENDED", "", EValueType.TEXT.getValue(), "Used for providing the equivalent value from resource to signal the suspended status", false); + +// rsc.addResourceSpecificationCharacteristicItemShort( "properties", "", EValueType.SET.getValue()); +// rsc.addResourceSpecificationCharacteristicItemShort( "additionalProperties", "", EValueType.SET.getValue()); + + + return rsc; + } + + @Override + public ResourceSpecificationUpdate toRSpecUpdate() { + return this.toRSpecCreate(); + } + + @Override + public KubernetesCRV1 fromRSpec(ResourceSpecification rSpec) { + osl_KUBCRV1_RSPEC_UUID = rSpec.getUuid(); + return this; + } + + @Override + public ResourceCreate toResourceCreate() { + + if (osl_KUBCRV1_RSPEC_UUID == null) { + return null; + } + + ResourceSpecificationRef rSpecRef = new ResourceSpecificationRef(); + rSpecRef.setId( osl_KUBCRV1_RSPEC_UUID ); + rSpecRef.setName( OSL_KUBCRV1_RSPEC_NAME ); + rSpecRef.setVersion( OSL_KUBCRV1_RSPEC_VERSION ); + + ResourceCreate rs = new ResourceCreate(); + rs.name( this.name ) + .category( this.category ) + .description( this.description ) + + .resourceStatus( ResourceStatusType.RESERVED ) + + .operationalState( ResourceOperationalStateType.ENABLE ) + .resourceSpecification( rSpecRef ) + .resourceVersion( this.version); + + rs.addResourceCharacteristicItemShort("clusterMasterURL", this.clusterMasterURL, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("currentContextCluster", this.currentContextCluster, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("fullResourceName", this.fullResourceName, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("Kind", this.kind, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("apiGroup", this.apiGroup, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("apiVersion", this.version , EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("UID", this.UID, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("namespace", this.namespace, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("metadata", this.metadata, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("yaml", this.yaml, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("json", this.json, EValueType.TEXT.getValue()); + + + rs.addResourceCharacteristicItemShort("_CR_SPEC_APPLIED", this.cr_spec_applied, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECK_FIELD", this.statusCheckFieldName, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_STANDBY", this.statusCheckValueStandby, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_ALARM", this.statusCheckValueAlarm, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_AVAILABLE", this.statusCheckValueAvailable, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_RESERVED", this.statusCheckValueReserved, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_UNKNOWN", this.statusCheckValueUnknown, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("_CR_CHECKVAL_SUSPENDED", this.statusCheckValueSuspended, EValueType.TEXT.getValue()); + + rs.resourceStatus( this.statusValue ); + + if (this.properties != null) + this.properties.forEach((kPropName, vProVal) -> { + rs.addResourceCharacteristicItemShort(kPropName , vProVal, EValueType.TEXT.getValue()); + + }); + + if (this.additionalProperties != null ) { + this.additionalProperties.forEach((kPropName, vProVal) -> { + rs.addResourceCharacteristicItemShort(kPropName, vProVal, EValueType.TEXT.getValue()); + + }); + } + + + return rs; + } + + @Override + public ResourceUpdate toResourceUpdate() { + + return this.toResourceCreate(); + } + +} diff --git a/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesContextDefinition.java b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesContextDefinition.java new file mode 100644 index 0000000000000000000000000000000000000000..c4f6a01987e8efe01f00b13e345b202ddda564f8 --- /dev/null +++ b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesContextDefinition.java @@ -0,0 +1,155 @@ +package org.etsi.osl.domain.model.kubernetes; + +import org.etsi.osl.domain.model.DomainModelDefinition; +import org.etsi.osl.domain.model.ITMFRCM634_ModelTransformer; +import org.etsi.osl.domain.model.ITMFRI639_ModelTransformer; +import org.etsi.osl.tmf.common.model.ELifecycle; +import org.etsi.osl.tmf.common.model.EValueType; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationUpdate; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceOperationalStateType; +import org.etsi.osl.tmf.ri639.model.ResourceStatusType; +import org.etsi.osl.tmf.ri639.model.ResourceUpdate; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ctranoris + */ +@Getter +@Setter +public class KubernetesContextDefinition + extends DomainModelDefinition + implements ITMFRCM634_ModelTransformer, ITMFRI639_ModelTransformer { + + + public static final String OSL_KUBD_RSPEC_NAME = "kubernetes-context-definition.openslice.io"; + public static final String OSL_KUBD_RSPEC_VERSION = "0.0.1"; + public static final String OSL_KUBD_RSPEC_CATEGORY = "KubernetesContextDefinition"; + public static final String OSL_KUBD_RESOURCE_CATEGORY = "KubernetesContextDefinition"; + public static final String OSL_KUBD_RSPEC_TYPE = "LogicalResourceSpecification"; + public static final String OSL_KUBD_RSPEC_DESCRIPTION = "This Specification is used to describe a KubernetesClient"; + + private String osl_KUBD_SPEC_UUID = null; //this is assigned by the system through the DB for a specific instance + + //properties of an instance + private String masterURL; + private String currentContextName; + private String currentContextCluster; + private String currentContextUser; + private String clusterVersion; + + + @Builder + public KubernetesContextDefinition(String osl_KUBD_SPEC_UUID, String uuid, String name, String version, String description, String category, + String masterURL, String currentContextName, String currentContextCluster, String currentContextUser, + String clusterVersion) { + super(uuid, name, version, description, category); + this.osl_KUBD_SPEC_UUID = osl_KUBD_SPEC_UUID; + this.masterURL = masterURL; + this.currentContextName = currentContextName; + this.currentContextCluster = currentContextCluster; + this.currentContextUser = currentContextUser; + this.clusterVersion = clusterVersion; + } + + + @Override + public ResourceSpecificationCreate toRSpecCreate_InitRepo() { + ResourceSpecificationCreate rsc = this.toRSpecCreate(); + rsc.setName( OSL_KUBD_RSPEC_NAME ); + rsc.setVersion( OSL_KUBD_RSPEC_VERSION ); + rsc.setCategory( OSL_KUBD_RSPEC_CATEGORY ); + rsc.setDescription( OSL_KUBD_RSPEC_DESCRIPTION ); + rsc.setType( OSL_KUBD_RSPEC_TYPE ); + rsc.setLifecycleStatus( ELifecycle.ACTIVE.getValue() ); + + return rsc; + + } + + @Override + public ResourceSpecificationCreate toRSpecCreate() { + ResourceSpecificationCreate rsc = new ResourceSpecificationCreate(); + rsc.setName( this.name ); + rsc.setVersion( this.version ); + rsc.setCategory( OSL_KUBD_RSPEC_CATEGORY ); + rsc.setDescription( this.description ); + rsc.setType( OSL_KUBD_RSPEC_TYPE ); + rsc.setLifecycleStatus( ELifecycle.ACTIVE.getValue() ); + rsc.addResourceSpecificationCharacteristicItemShort( "masterURL", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "resourceVersion", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "currentContextName", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "currentContextCluster", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "currentContextUser", "", EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort( "clusterVersion", "", EValueType.TEXT.getValue(), "", false); + return rsc; + + } + + @Override + public ResourceSpecificationUpdate toRSpecUpdate() { + return this.toRSpecCreate(); + } + + /* we care only for the ID of the specification from the stored model. The definition will be static + * (non-Javadoc) + * @see org.etsi.osl.domain.model.ITMFRCM634_ModelTransformer#fromRSpec(org.etsi.osl.tmf.rcm634.model.ResourceSpecification) + */ + @Override + public KubernetesContextDefinition fromRSpec(ResourceSpecification rSpec) { + osl_KUBD_SPEC_UUID = rSpec.getUuid(); + return this; + } + + + /* + * returns Null if OSL_KUBD_RSPEC_UUID is not initialized + * (non-Javadoc) + * @see org.etsi.osl.domain.model.ITMFRI639_ModelTransformer#toResourceCreate() + */ + @Override + public ResourceCreate toResourceCreate() throws Exception { + if (this.osl_KUBD_SPEC_UUID == null) { + throw new Exception( "osl_UUID is null. Resource cannot be created without referring a Resource specification" ); + + } + + ResourceSpecificationRef rSpecRef = new ResourceSpecificationRef(); + rSpecRef.setId( this.osl_KUBD_SPEC_UUID ); + rSpecRef.setName( OSL_KUBD_RSPEC_NAME ); + rSpecRef.setVersion( OSL_KUBD_RSPEC_VERSION ); + + ResourceCreate rs = new ResourceCreate(); + rs.setName( this.name ); + rs.setResourceStatus( ResourceStatusType.AVAILABLE ); + rs.setOperationalState( ResourceOperationalStateType.ENABLE); + rs.setCategory( OSL_KUBD_RESOURCE_CATEGORY ); + rs.setResourceSpecification(rSpecRef); + rs.resourceVersion( this.clusterVersion ); + + rs.addResourceCharacteristicItemShort("masterUrl", this.masterURL, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("currentContextName", this.currentContextName , EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("currentContextCluster", this.currentContextCluster , EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("currentContextUser", this.currentContextUser , EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("clusterVersion", this.clusterVersion , EValueType.TEXT.getValue()); + + + + + return rs; + } + + @Override + public ResourceUpdate toResourceUpdate() throws Exception { + return this.toResourceCreate(); + } + + + + +} diff --git a/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesSecret.java b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesSecret.java new file mode 100644 index 0000000000000000000000000000000000000000..820c777f39fcc275e8d3eea9d6b822313cd057cc --- /dev/null +++ b/src/main/java/org/etsi/osl/domain/model/kubernetes/KubernetesSecret.java @@ -0,0 +1,213 @@ +package org.etsi.osl.domain.model.kubernetes; + +import java.util.HashMap; +import java.util.Map; +import org.etsi.osl.domain.model.DomainModelDefinition; +import org.etsi.osl.domain.model.ITMFRCM634_ModelTransformer; +import org.etsi.osl.domain.model.ITMFRI639_ModelTransformer; +import org.etsi.osl.tmf.common.model.ELifecycle; +import org.etsi.osl.tmf.common.model.EValueType; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationUpdate; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceOperationalStateType; +import org.etsi.osl.tmf.ri639.model.ResourceStatusType; +import org.etsi.osl.tmf.ri639.model.ResourceUpdate; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ctranoris + */ +@Getter +@Setter +public class KubernetesSecret extends DomainModelDefinition + implements ITMFRCM634_ModelTransformer, ITMFRI639_ModelTransformer { + + public static final String OSL_KUBSECRET_RSPEC_NAME = "kubernetes-secret.openslice.io"; + public static final String OSL_KUBSECRET_RSPEC_VERSION = "0.0.3"; + public static final String OSL_KUBSECRET_RSPEC_CATEGORY = "Secret/Kubernetes/v1"; + public static final String OSL_KUBSECRET_RESOURCE_CATEGORY = "Secret/Kubernetes/v1"; + public static final String OSL_KUBSECRET_RSPEC_TYPE = "LogicalResourceSpecification"; + public static final String OSL_KUBSECRET_RSPEC_DESCRIPTION = "This Specification is used to describe a generic Kubernetes Secret"; + + private String osl_KUBCRD_RSPEC_UUID = null; //this is assigned by the system through the DB for a specific instance + + private String clusterMasterURL; + private String currentContextCluster; + private String fullResourceName; + private String kind; + private String apiGroup; + private String UID; + private String metadata; + private String yaml; + private String json; + private String namespace; + + + private Map data; + private String dataObj; + private Map properties; + + + @Builder + public KubernetesSecret(String osl_KUBCRD_RSPEC_UUID, String uuid, String name, String version, String description, String category, + String clusterMasterURL, String currentContextCluster, String fullResourceName, String namespace, + String kind, String apiGroup, String uID, + String metadata, + String yaml, + String json) { + super(uuid, name, version, description, category); + this.osl_KUBCRD_RSPEC_UUID = osl_KUBCRD_RSPEC_UUID; + this.clusterMasterURL = clusterMasterURL; + this.currentContextCluster = currentContextCluster; + this.fullResourceName = fullResourceName; + this.kind = kind; + this.apiGroup = apiGroup; + this.namespace = namespace; + this.UID = uID; + this.metadata = metadata; + this.yaml = yaml; + this.json = json; + this.properties = new HashMap<>(); + this.data = new HashMap<>(); + this.category = OSL_KUBSECRET_RSPEC_CATEGORY; + } + + + + @Override + public ResourceSpecificationCreate toRSpecCreate_InitRepo() { + + ResourceSpecificationCreate rsc = this.toRSpecCreate(); + rsc.setName( OSL_KUBSECRET_RSPEC_NAME ); + rsc.setCategory( OSL_KUBSECRET_RSPEC_CATEGORY ); + rsc.setVersion(OSL_KUBSECRET_RSPEC_VERSION); + rsc.setDescription( OSL_KUBSECRET_RSPEC_DESCRIPTION ); + rsc.setType( OSL_KUBSECRET_RSPEC_TYPE ); + + + + return rsc; + } + + @Override + public ResourceSpecificationCreate toRSpecCreate() { + + ResourceSpecificationCreate rsc = new ResourceSpecificationCreate(); + rsc.setName( this.name ); + rsc.setCategory( OSL_KUBSECRET_RSPEC_CATEGORY ); + rsc.setVersion( this.version ); + rsc.setDescription( this.version ); + rsc.setType( OSL_KUBSECRET_RSPEC_TYPE ); + + rsc.setLifecycleStatus( ELifecycle.ACTIVE.getValue() ); + rsc.addResourceSpecificationCharacteristicItemShort("clusterMasterURL", this.clusterMasterURL, EValueType.TEXT.getValue(), "URL of cluster", false); + rsc.addResourceSpecificationCharacteristicItemShort("currentContextCluster", this.currentContextCluster, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("fullResourceName", this.fullResourceName, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("Kind", this.kind, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("apiGroup", this.apiGroup, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("UID", this.UID, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("metadata", this.metadata, EValueType.OBJECT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("yaml", this.yaml, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("json", this.json, EValueType.TEXT.getValue(), "", false); + rsc.addResourceSpecificationCharacteristicItemShort("data", this.dataObj, EValueType.OBJECT.getValue(), "", false); + + if (this.properties != null) + this.properties.forEach((kPropName, vProVal) -> { + EValueType etype; + etype = EValueType.TEXT; + rsc.addResourceSpecificationCharacteristicItemShort(kPropName , vProVal, etype.getValue(), "", false); + + }); + if (this.data != null) + this.data.forEach((kPropName, vProVal) -> { + EValueType etype; + etype = EValueType.TEXT; + rsc.addResourceSpecificationCharacteristicItemShort(kPropName , vProVal, etype.getValue(), "", false); + + }); + + + + return rsc; + } + + @Override + public ResourceSpecificationUpdate toRSpecUpdate() { + return this.toRSpecCreate(); + } + + @Override + public KubernetesSecret fromRSpec(ResourceSpecification rSpec) { + this.osl_KUBCRD_RSPEC_UUID = rSpec.getUuid(); + return this; + } + + @Override + public ResourceCreate toResourceCreate() { + + if (osl_KUBCRD_RSPEC_UUID == null) { + return null; + } + + ResourceSpecificationRef rSpecRef = new ResourceSpecificationRef(); + rSpecRef.setId( osl_KUBCRD_RSPEC_UUID ); + rSpecRef.setName( OSL_KUBSECRET_RSPEC_NAME ); + rSpecRef.setVersion( OSL_KUBSECRET_RSPEC_VERSION ); + + ResourceCreate rs = new ResourceCreate(); + rs.name( this.name ) + .category( OSL_KUBSECRET_RESOURCE_CATEGORY ) + .description( this.description ) + .resourceStatus( ResourceStatusType.AVAILABLE ) + .operationalState( ResourceOperationalStateType.ENABLE ) + .resourceSpecification( rSpecRef ) + .resourceVersion( this.version); + + rs.addResourceCharacteristicItemShort("clusterMasterURL", this.clusterMasterURL, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("currentContextCluster", this.currentContextCluster, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("fullResourceName", this.fullResourceName, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("Kind", this.kind, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("apiGroup", this.apiGroup, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("UID", this.UID, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("metadata", this.metadata, EValueType.OBJECT.getValue()); + rs.addResourceCharacteristicItemShort("yaml", this.yaml, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("json", this.json, EValueType.TEXT.getValue()); + rs.addResourceCharacteristicItemShort("data", this.dataObj, EValueType.OBJECT.getValue()); + + + + + if (this.properties != null) + this.properties.forEach((kPropName, vProVal) -> { + EValueType etype; + etype = EValueType.TEXT; + + rs.addResourceCharacteristicItemShort(kPropName , vProVal, etype.getValue()); + + }); + if (this.data != null) + this.data.forEach((kPropName, vProVal) -> { + EValueType etype; + etype = EValueType.TEXT; + rs.addResourceCharacteristicItemShort(kPropName , vProVal, etype.getValue()); + + }); + + + + + return rs; + } + + @Override + public ResourceUpdate toResourceUpdate() { + + return this.toResourceCreate(); + } + +} diff --git a/target/.gitignore b/target/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..840e7d3120ee3206168d49bf62df2c269c38e17e --- /dev/null +++ b/target/.gitignore @@ -0,0 +1 @@ +/classes/