Specify model at service creation

Allows a user to select a model when designing a service

Issue-ID: SDC-3621
Signed-off-by: aribeiro <anderson.ribeiro@est.tech>
Change-Id: I386e43ddeb649a4ba0805f153e4b47e8a528cff0
diff --git a/catalog-ui/src/app/models/components/component.ts b/catalog-ui/src/app/models/components/component.ts
index be92f76..a60d7be 100644
--- a/catalog-ui/src/app/models/components/component.ts
+++ b/catalog-ui/src/app/models/components/component.ts
@@ -146,6 +146,7 @@
     public categorySpecificMetadata: Metadata = new Metadata();
     public derivedFromGenericType: string;
     public derivedFromGenericVersion: string;
+    public model: Model;
 
     constructor(componentService:IComponentService, protected $q:ng.IQService, component?:Component) {
         if (component) {
@@ -210,6 +211,7 @@
 
             this.derivedFromGenericType = component.derivedFromGenericType;
             this.derivedFromGenericVersion = component.derivedFromGenericVersion;
+            this.model = component.model;
         }
 
         //custom properties
diff --git a/catalog-ui/src/app/models/model.ts b/catalog-ui/src/app/models/model.ts
new file mode 100644
index 0000000..239d86e
--- /dev/null
+++ b/catalog-ui/src/app/models/model.ts
@@ -0,0 +1,22 @@
+/*
+* ============LICENSE_START=======================================================
+*  Copyright (C) 2021 Nordix Foundation. All rights reserved.
+*  ================================================================================
+*  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.
+*
+*  SPDX-License-Identifier: Apache-2.0
+*  ============LICENSE_END=========================================================
+*/
+
+interface Model {
+  name:string;
+}
diff --git a/catalog-ui/src/app/modules/service-module.ts b/catalog-ui/src/app/modules/service-module.ts
index 38cd272..de62091 100644
--- a/catalog-ui/src/app/modules/service-module.ts
+++ b/catalog-ui/src/app/modules/service-module.ts
@@ -44,6 +44,7 @@
 import { ModalService } from '../ng2/services/modal.service';
 import { OnboardingService } from '../ng2/services/onboarding.service';
 import { ElementService } from '../ng2/services/element.service';
+import { ModelService } from '../ng2/services/model.service';
 import { PluginsService } from '../ng2/services/plugins.service';
 import { PoliciesService as PoliciesServiceNg2 } from '../ng2/services/policies.service';
 import { SharingService } from '../ng2/services/sharing.service';
@@ -128,4 +129,5 @@
 serviceModule.factory('NodesFactory', downgradeInjectable(NodesFactory));
 serviceModule.service('OnboardingService', downgradeInjectable(OnboardingService));
 serviceModule.service('ElementService', downgradeInjectable(ElementService));
+serviceModule.service('ModelService', downgradeInjectable(ModelService));
 serviceModule.service('ImportVSPService', downgradeInjectable(ImportVSPService));
diff --git a/catalog-ui/src/app/ng2/app.module.ts b/catalog-ui/src/app/ng2/app.module.ts
index 88a5610..bb11199 100644
--- a/catalog-ui/src/app/ng2/app.module.ts
+++ b/catalog-ui/src/app/ng2/app.module.ts
@@ -100,6 +100,7 @@
 import {InterfaceOperationHandlerModule} from "./pages/composition/interface-operatons/operation-creator/interface-operation-handler.module";
 import {AttributesOutputsModule} from "./pages/attributes-outputs/attributes-outputs.module";
 import { ElementService } from "./services/element.service";
+import { ModelService } from "./services/model.service";
 
 
 declare const __ENV__: string;
@@ -199,6 +200,7 @@
     ImportVSPService,
     OnboardingService,
     ElementService,
+    ModelService,
     ServiceServiceNg2,
     AutomatedUpgradeService,
     WorkflowServiceNg2,
diff --git a/catalog-ui/src/app/ng2/services/model.service.ts b/catalog-ui/src/app/ng2/services/model.service.ts
new file mode 100644
index 0000000..33d5729
--- /dev/null
+++ b/catalog-ui/src/app/ng2/services/model.service.ts
@@ -0,0 +1,37 @@
+/*
+* ============LICENSE_START=======================================================
+*  Copyright (C) 2021 Nordix Foundation. All rights reserved.
+*  ================================================================================
+*  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.
+*
+*  SPDX-License-Identifier: Apache-2.0
+*  ============LICENSE_END=========================================================
+*/
+import { HttpClient } from '@angular/common/http';
+import { Inject, Injectable } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { ISdcConfig, SdcConfigToken } from '../config/sdc-config.config';
+
+@Injectable()
+export class ModelService {
+
+  protected baseUrl;
+
+  constructor(protected http: HttpClient, @Inject(SdcConfigToken) sdcConfig: ISdcConfig) {
+    this.baseUrl = sdcConfig.api.root;
+  }
+
+  getModels():Observable<Model[]> {
+    return this.http.get<Model[]>(this.baseUrl + "/v1/catalog/model");
+  }
+
+}
diff --git a/catalog-ui/src/app/ng2/services/responses/component-generic-response.ts b/catalog-ui/src/app/ng2/services/responses/component-generic-response.ts
index 6011aab..96a2126 100644
--- a/catalog-ui/src/app/ng2/services/responses/component-generic-response.ts
+++ b/catalog-ui/src/app/ng2/services/responses/component-generic-response.ts
@@ -61,6 +61,7 @@
     public substitutionFilters: any;
     public derivedFromGenericType;
     public derivedFromGenericVersion;
+    public model:Model;
 
     deserialize (response): ComponentGenericResponse {
 
@@ -138,6 +139,9 @@
         if(response.derivedFromGenericVersion) {
             this.derivedFromGenericVersion = response.derivedFromGenericVersion;
         }
+        if(response.model) {
+            this.model = response.model;
+        }
         return this;
     }
 }
diff --git a/catalog-ui/src/app/services-ng2.ts b/catalog-ui/src/app/services-ng2.ts
index 119f2e3..3d52e00 100644
--- a/catalog-ui/src/app/services-ng2.ts
+++ b/catalog-ui/src/app/services-ng2.ts
@@ -17,6 +17,7 @@
 export * from './ng2/services/event-bus.service';
 export * from './ng2/services/groups.service';
 export * from './ng2/services/element.service';
+export * from './ng2/services/model.service';
 
 export * from './ng2/services/component-services/component.service';
 export * from './ng2/services/component-services/component.service.factory';
diff --git a/catalog-ui/src/app/utils/component-factory.ts b/catalog-ui/src/app/utils/component-factory.ts
index 667c6bc..2ff2af9 100644
--- a/catalog-ui/src/app/utils/component-factory.ts
+++ b/catalog-ui/src/app/utils/component-factory.ts
@@ -199,6 +199,7 @@
             component.setComponentMetadata(response.metadata);
             component.derivedFromGenericType = response.derivedFromGenericType;
             component.derivedFromGenericVersion = response.derivedFromGenericVersion;
+            component.model = response.model;
             deferred.resolve(component);
         });
         return deferred.promise;
diff --git a/catalog-ui/src/app/view-models/workspace/tabs/general/general-view-model.ts b/catalog-ui/src/app/view-models/workspace/tabs/general/general-view-model.ts
index b456bec..9b7a92b 100644
--- a/catalog-ui/src/app/view-models/workspace/tabs/general/general-view-model.ts
+++ b/catalog-ui/src/app/view-models/workspace/tabs/general/general-view-model.ts
@@ -33,7 +33,7 @@
     ValidationUtils
 } from "app/utils";
 import {EventListenerService, ProgressService} from "app/services";
-import {CacheService, ElementService, ImportVSPService, OnboardingService} from "app/services-ng2";
+import {CacheService, ElementService, ModelService, ImportVSPService, OnboardingService} from "app/services-ng2";
 import {Component, IAppConfigurtaion, ICsarComponent, IMainCategory, IMetadataKey, ISubCategory, IValidate, Resource, Service} from "app/models";
 import {IWorkspaceViewModelScope} from "app/view-models/workspace/workspace-view-model";
 import {CATEGORY_SERVICE_METADATA_KEYS, PREVIOUS_CSAR_COMPONENT} from "../../../../utils/constants";
@@ -53,6 +53,10 @@
     selectedCategory:string;
 }
 
+export class componentModel {
+    selectedModel:string;
+}
+
 export interface IEnvironmentContext {
     defaultValue:string;
     validValues:Array<string>;
@@ -73,6 +77,7 @@
     importCsarProProgressKey:string;
     browseFileLabel:string;
     componentCategories:componentCategories;
+    componentModel:componentModel;
     instantiationTypes:Array<instantiationType>;
     isHiddenCategorySelected: boolean;
 
@@ -95,6 +100,7 @@
     onInstantiationTypeChange():void;
     updateIcon():void;
     possibleToUpdateIcon():boolean;
+    initModel():void;
 }
 
 // tslint:disable-next-line:max-classes-per-file
@@ -124,6 +130,7 @@
         'ComponentFactory',
         'ImportVSPService',
         'ElementService',
+        'ModelService',
         '$stateParams'
     ];
 
@@ -150,6 +157,7 @@
                 private ComponentFactory:ComponentFactory,
                 private importVSPService: ImportVSPService,
                 private elementService: ElementService,
+                private modelService: ModelService,
                 private $stateParams: any) {
 
         this.initScopeValidation();
@@ -270,6 +278,7 @@
             // Init Instantiation types
             this.$scope.initInstantiationTypes();
             this.$scope.initBaseTypes();
+            this.$scope.initModel();
         }
 
         if (this.cacheService.get(PREVIOUS_CSAR_COMPONENT)) { //keep the old component in the cache until checkout, so we dont need to pass it around
@@ -451,6 +460,15 @@
             }
         };
 
+        this.$scope.initModel = ():void => {
+            if (this.$scope.componentType === ComponentType.SERVICE) {
+                this.$scope.models = new Array();
+                this.modelService.getModels().subscribe((modelsFound: Model[]) => {
+                    modelsFound.forEach(model => {this.$scope.models.push(model.name)});})
+                this.$scope.models.filter(model => model.name === (<Service>this.$scope.component).model);
+            }
+        };
+
         this.$scope.initEnvironmentContext = ():void => {
             if (this.$scope.componentType === ComponentType.SERVICE) {
                 this.$scope.environmentContextObj = this.cacheService.get('UIConfiguration').environmentContext;
diff --git a/catalog-ui/src/app/view-models/workspace/tabs/general/general-view.html b/catalog-ui/src/app/view-models/workspace/tabs/general/general-view.html
index d598e17..d2529f9 100644
--- a/catalog-ui/src/app/view-models/workspace/tabs/general/general-view.html
+++ b/catalog-ui/src/app/view-models/workspace/tabs/general/general-view.html
@@ -607,7 +607,22 @@
                 		</div>
                 	</div>
 
-                    <!--------------------- Instantiation Type -------------------->
+                    <!--------------------- Base Type -------------------->
+
+                  <!--------------------- Model -------------------->
+                  <div class="i-sdc-form-item" data-ng-if="component.isService()">
+                    <label class="i-sdc-form-label">Model</label>
+                    <select class="i-sdc-form-select"
+                            name="modelName"
+                            data-ng-class="{'view-mode': isViewMode()}"
+                            data-ng-disabled="component.isCsarComponent() || !isCreateMode()"
+                            data-ng-model="component.model"
+                            data-tests-id="modelName">
+                      <option value="">SDC AID</option>
+                      <option ng-repeat="model in models | orderBy:[name]">{{model}}</option>
+                    </select>
+                  </div>
+                  <!--------------------- Model -------------------->
 
                     <div class="meta-data" data-ng-if="component.creationDate">
                         <div>