7eac3d92aa9cd20eefde899191b2c6c067c10288
[clamp.git] / src / main / java / org / onap / clamp / clds / model / CldsModel.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP CLAMP
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                             reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END============================================
20  * ===================================================================
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  */
23
24 package org.onap.clamp.clds.model;
25
26 import com.att.eelf.configuration.EELFLogger;
27 import com.att.eelf.configuration.EELFManager;
28
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.List;
32
33 import javax.ws.rs.BadRequestException;
34 import javax.ws.rs.NotFoundException;
35
36 import org.onap.clamp.clds.dao.CldsDao;
37
38 /**
39  * Represent a CLDS Model.
40  */
41 public class CldsModel {
42     protected static final EELFLogger logger             = EELFManager.getInstance().getLogger(CldsModel.class);
43     protected static final EELFLogger metricsLogger      = EELFManager.getInstance().getMetricsLogger();
44
45     private static final int          UUID_LENGTH        = 36;
46
47     public static final String        STATUS_DESIGN      = "DESIGN";
48     public static final String        STATUS_DISTRIBUTED = "DISTRIBUTED";
49     public static final String        STATUS_ACTIVE      = "ACTIVE";
50     public static final String        STATUS_STOPPED     = "STOPPED";
51     public static final String        STATUS_DELETING    = "DELETING";
52     public static final String        STATUS_ERROR       = "ERROR";                                             // manual
53                                                                                                                 // intervention
54                                                                                                                 // required
55     public static final String        STATUS_UNKNOWN     = "UNKNOWN";
56
57     private String                    id;
58     private String                    templateId;
59     private String                    templateName;
60     private String                    name;
61     private String                    controlNamePrefix;
62     private String                    controlNameUuid;
63     private String                    bpmnId;
64     private String                    bpmnUserid;
65     private String                    bpmnText;
66     private String                    propId;
67     private String                    propUserid;
68     private String                    propText;
69     private String                    imageId;
70     private String                    imageUserid;
71     private String                    imageText;
72     private String                    docId;
73     private String                    docUserid;
74     private String                    docText;
75     private String                    blueprintId;
76     private String                    blueprintUserid;
77     private String                    blueprintText;
78     private CldsEvent                 event;
79     private String                    status;
80     private List<String>              permittedActionCd;
81     private List<CldsModelInstance>   cldsModelInstanceList;
82
83     private String                    typeId;
84     private String                    typeName;
85
86     private String                    dispatcherResponse;
87
88     private String                    deploymentId;
89
90     private boolean                   userAuthorizedToUpdate;
91
92     /**
93      * Construct empty model.
94      */
95     public CldsModel() {
96         event = new CldsEvent();
97     }
98
99     /**
100      * Retrieve from DB.
101      *
102      * @param cldsDao
103      * @param name
104      * @return
105      */
106     public static CldsModel retrieve(CldsDao cldsDao, String name, boolean okIfNotFound) {
107         // get from db
108         CldsModel model = cldsDao.getModelTemplate(name);
109         if (model.getId() == null && !okIfNotFound) {
110             throw new NotFoundException();
111         }
112         model.determineStatus();
113         model.determinePermittedActionCd();
114         return model;
115     }
116
117     public boolean canInventoryCall() {
118         boolean canCall = false;
119         /* Below checks the clds ecent is submit/resubmit */
120
121         if ((event.isActionCd(CldsEvent.ACTION_SUBMIT) || event.isActionCd(CldsEvent.ACTION_RESUBMIT))) {
122             canCall = true;
123         }
124         return canCall;
125     }
126
127     /**
128      * Save model to DB.
129      *
130      * @param cldsDao
131      * @param userid
132      */
133     public void save(CldsDao cldsDao, String userid) {
134         cldsDao.setModel(this, userid);
135         determineStatus();
136         determinePermittedActionCd();
137     }
138
139     /**
140      * Insert a new event for the new action. Throw IllegalArgumentException if
141      * requested actionCd is not permitted.
142      *
143      * @param cldsDao
144      * @param userid
145      * @param actionCd
146      * @param actionStateCd
147      */
148     public void insEvent(CldsDao cldsDao, String userid, String actionCd, String actionStateCd) {
149         validateAction(actionCd);
150         event = CldsEvent.insEvent(cldsDao, this, userid, actionCd, actionStateCd, null);
151         determineStatus();
152         determinePermittedActionCd();
153     }
154
155     /**
156      * Update event with processInstanceId
157      *
158      * @param cldsDao
159      * @param processInstanceId
160      */
161     public void updEvent(CldsDao cldsDao, String processInstanceId) {
162         cldsDao.updEvent(event.getId(), processInstanceId);
163     }
164
165     /**
166      * set the status in the model
167      */
168     private void determineStatus() {
169
170         status = STATUS_UNKNOWN;
171         if (event == null || event.getActionCd() == null) {
172             status = STATUS_DESIGN;
173         } else if (event.isActionStateCd(CldsEvent.ACTION_STATE_ERROR)) {
174             status = STATUS_ERROR;
175         } else if (event.isActionAndStateCd(CldsEvent.ACTION_CREATE, CldsEvent.ACTION_STATE_ANY)
176                 || event.isActionAndStateCd(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_STATE_ANY)
177                 || event.isActionAndStateCd(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_STATE_ANY)
178                 || event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_RECEIVED)) {
179             status = STATUS_DESIGN;
180         } else if (event.isActionAndStateCd(CldsEvent.ACTION_DISTRIBUTE, CldsEvent.ACTION_STATE_RECEIVED)
181                 || event.isActionAndStateCd(CldsEvent.ACTION_UNDEPLOY, CldsEvent.ACTION_STATE_RECEIVED)) {
182             status = STATUS_DISTRIBUTED;
183         } else if (event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_SENT)) {
184             status = STATUS_DELETING;
185         } else if (event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_RECEIVED)
186                 || event.isActionAndStateCd(CldsEvent.ACTION_RESTART, CldsEvent.ACTION_STATE_ANY)
187                 || event.isActionAndStateCd(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STATE_ANY)
188                 || event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_ANY)) {
189             status = STATUS_ACTIVE;
190         } else if (event.isActionAndStateCd(CldsEvent.ACTION_STOP, CldsEvent.ACTION_STATE_ANY)) {
191             status = STATUS_STOPPED;
192         }
193
194     }
195
196     /**
197      * Get the actionCd from current event. If none, default value is
198      * CldsEvent.ACTION_CREATE
199      *
200      * @return
201      */
202     private String getCurrentActionCd() {
203         // current default actionCd is CREATE
204         String actionCd = CldsEvent.ACTION_CREATE;
205         if (event != null && event.getActionCd() != null) {
206             actionCd = event.getActionCd();
207         }
208         return actionCd;
209     }
210
211     /**
212      * Get the actionStateCd from current event. If none, default value is
213      * CldsEvent.ACTION_STATE_COMPLETED
214      *
215      * @return
216      */
217     private String getCurrentActionStateCd() {
218         // current default actionStateCd is CREATE
219         String actionStateCd = CldsEvent.ACTION_STATE_COMPLETED;
220         if (event != null && event.getActionStateCd() != null) {
221             actionStateCd = event.getActionStateCd();
222         }
223         return actionStateCd;
224     }
225
226     /**
227      * Determine permittedActionCd list using the actionCd from the current
228      * event.
229      */
230     private void determinePermittedActionCd() {
231         String actionCd = getCurrentActionCd();
232         switch (actionCd) {
233             case CldsEvent.ACTION_CREATE:
234                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_TEST);
235                 break;
236             case CldsEvent.ACTION_SUBMIT:
237             case CldsEvent.ACTION_RESUBMIT:
238                 // for 1702 delete is not currently implemented (and resubmit
239                 // requires manually deleting artifact from sdc
240                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT);
241                 break;
242             case CldsEvent.ACTION_DISTRIBUTE:
243                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_RESUBMIT);
244                 break;
245             case CldsEvent.ACTION_UNDEPLOY:
246                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY,
247                         CldsEvent.ACTION_RESUBMIT);
248                 break;
249             case CldsEvent.ACTION_DEPLOY:
250                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UNDEPLOY,
251                         CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
252                 break;
253             case CldsEvent.ACTION_RESTART:
254             case CldsEvent.ACTION_UPDATE:
255                 // for 1702 delete is not currently implemented
256                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UPDATE,
257                         CldsEvent.ACTION_STOP, CldsEvent.ACTION_UNDEPLOY);
258                 break;
259             case CldsEvent.ACTION_DELETE:
260                 if (getCurrentActionStateCd().equals(CldsEvent.ACTION_STATE_SENT)) {
261                     permittedActionCd = Arrays.asList();
262                 } else {
263                     permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMIT);
264                 }
265                 break;
266             case CldsEvent.ACTION_STOP:
267                 // for 1702 delete is not currently implemented
268                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART,
269                         CldsEvent.ACTION_UNDEPLOY);
270                 break;
271             default:
272                 logger.warn("Invalid current actionCd: " + actionCd);
273         }
274     }
275
276     /**
277      * Validate requestedActionCd - determine permittedActionCd and then check
278      * if contained in permittedActionCd Throw IllegalArgumentException if
279      * requested actionCd is not permitted.
280      *
281      * @param requestedActionCd
282      */
283     public void validateAction(String requestedActionCd) {
284         determinePermittedActionCd();
285         if (!permittedActionCd.contains(requestedActionCd)) {
286             throw new IllegalArgumentException(
287                     "Invalid requestedActionCd: " + requestedActionCd + ".  Given current actionCd: "
288                             + getCurrentActionCd() + ", the permittedActionCd: " + permittedActionCd);
289         }
290     }
291
292     /**
293      * Extract the UUID portion of a given full control name (controlNamePrefix
294      * + controlNameUuid). No fields are populated other than controlNamePrefix
295      * and controlNameUuid. Throws BadRequestException if length of given
296      * control name is less than UUID_LENGTH.
297      *
298      * @param fullControlName
299      * @return
300      */
301     public static CldsModel createUsingControlName(String fullControlName) {
302         if (fullControlName == null || fullControlName.length() < UUID_LENGTH) {
303             throw new BadRequestException(
304                     "closed loop id / control name length, " + (fullControlName != null ? fullControlName.length() : 0)
305                             + ", less than the minimum of: " + UUID_LENGTH);
306         }
307         CldsModel model = new CldsModel();
308         model.setControlNamePrefix(fullControlName.substring(0, fullControlName.length() - UUID_LENGTH));
309         model.setControlNameUuid(fullControlName.substring(fullControlName.length() - UUID_LENGTH));
310         return model;
311     }
312
313     /**
314      * @return the controlName (controlNamePrefix + controlNameUuid)
315      */
316     public String getControlName() {
317         return controlNamePrefix + controlNameUuid;
318     }
319
320     /**
321      * To insert modelInstance to the database
322      *
323      * @param cldsDao
324      * @param dcaeEvent
325      */
326     public static CldsModel insertModelInstance(CldsDao cldsDao, DcaeEvent dcaeEvent, String userid) {
327         String controlName = dcaeEvent.getControlName();
328         CldsModel cldsModel = createUsingControlName(controlName);
329         cldsModel = cldsDao.getModelByUuid(cldsModel.getControlNameUuid());
330         cldsModel.determineStatus();
331         if (dcaeEvent.getCldsActionCd().equals(CldsEvent.ACTION_UNDEPLOY) || (dcaeEvent.getCldsActionCd()
332                 .equals(CldsEvent.ACTION_DEPLOY)
333                 && (cldsModel.getStatus().equals(STATUS_DISTRIBUTED) || cldsModel.getStatus().equals(STATUS_DESIGN)))) {
334             CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), userid, dcaeEvent.getCldsActionCd(),
335                     CldsEvent.ACTION_STATE_RECEIVED, null);
336         }
337         cldsDao.insModelInstance(cldsModel, dcaeEvent.getInstances());
338         return cldsModel;
339     }
340
341     /**
342      * To remove modelInstance from the database This method is defunct - DCAE
343      * Proxy will not undeploy individual instances. It will send an empty list
344      * of deployed instances to indicate all have been removed. Or it will send
345      * an updated list to indicate those that are still deployed with any not on
346      * the list considered undeployed.
347      *
348      * @param cldsDao
349      * @param dcaeEvent
350      */
351     @SuppressWarnings("unused")
352     private static CldsModel removeModelInstance(CldsDao cldsDao, DcaeEvent dcaeEvent) {
353         String controlName = dcaeEvent.getControlName();
354         // cldsModel = cldsDao.delModelInstance(cldsModel.getControlNameUuid(),
355         // dcaeEvent.getInstances() );
356         return createUsingControlName(controlName);
357     }
358
359     /**
360      * @return the name
361      */
362     public String getName() {
363         return name;
364     }
365
366     /**
367      * @param name
368      *            the name to set
369      */
370     public void setName(String name) {
371         this.name = name;
372     }
373
374     /**
375      * @return the typeName
376      */
377     public String getTypeName() {
378         return typeName;
379     }
380
381     /**
382      * @param name
383      *            the typeName to set
384      */
385     public void setTypeName(String typeName) {
386         this.typeName = typeName;
387     }
388
389     public String getTemplateId() {
390         return templateId;
391     }
392
393     public void setTemplateId(String templateId) {
394         this.templateId = templateId;
395     }
396
397     /**
398      * @return the controlNamePrefix
399      */
400     public String getControlNamePrefix() {
401         return controlNamePrefix;
402     }
403
404     /**
405      * @param controlNamePrefix
406      *            the controlNamePrefix to set
407      */
408     public void setControlNamePrefix(String controlNamePrefix) {
409         this.controlNamePrefix = controlNamePrefix;
410     }
411
412     /**
413      * @return the controlNameUuid
414      */
415     public String getControlNameUuid() {
416         return controlNameUuid;
417     }
418
419     /**
420      * @param controlNameUuid
421      *            the controlNameUuid to set
422      */
423     public void setControlNameUuid(String controlNameUuid) {
424         this.controlNameUuid = controlNameUuid;
425     }
426
427     /**
428      * @return the propUserid
429      */
430     public String getPropUserid() {
431         return propUserid;
432     }
433
434     /**
435      * @param propUserid
436      *            the propUserid to set
437      */
438     public void setPropUserid(String propUserid) {
439         this.propUserid = propUserid;
440     }
441
442     /**
443      * @return the propText
444      */
445     public String getPropText() {
446         return propText;
447     }
448
449     /**
450      * @param propText
451      *            the propText to set
452      */
453     public void setPropText(String propText) {
454         this.propText = propText;
455     }
456
457     /**
458      * @return the event
459      */
460     public CldsEvent getEvent() {
461         return event;
462     }
463
464     public String getId() {
465         return id;
466     }
467
468     public void setId(String id) {
469         this.id = id;
470     }
471
472     public String getTemplateName() {
473         return templateName;
474     }
475
476     public void setTemplateName(String templateName) {
477         this.templateName = templateName;
478     }
479
480     public String getPropId() {
481         return propId;
482     }
483
484     public void setPropId(String propId) {
485         this.propId = propId;
486     }
487
488     /**
489      * @param event
490      *            the event to set
491      */
492     public void setEvent(CldsEvent event) {
493         this.event = event;
494     }
495
496     /**
497      * @return the status
498      */
499     public String getStatus() {
500         return status;
501     }
502
503     /**
504      * @param status
505      *            the status to set
506      */
507     public void setStatus(String status) {
508         this.status = status;
509     }
510
511     /**
512      * @return the permittedActionCd
513      */
514     public List<String> getPermittedActionCd() {
515         return permittedActionCd;
516     }
517
518     /**
519      * @param permittedActionCd
520      *            the permittedActionCd to set
521      */
522     public void setPermittedActionCd(List<String> permittedActionCd) {
523         this.permittedActionCd = permittedActionCd;
524     }
525
526     public String getBlueprintId() {
527         return blueprintId;
528     }
529
530     public void setBlueprintId(String blueprintId) {
531         this.blueprintId = blueprintId;
532     }
533
534     public String getBlueprintUserid() {
535         return blueprintUserid;
536     }
537
538     public void setBlueprintUserid(String blueprintUserid) {
539         this.blueprintUserid = blueprintUserid;
540     }
541
542     public String getBlueprintText() {
543         return blueprintText;
544     }
545
546     public void setBlueprintText(String blueprintText) {
547         this.blueprintText = blueprintText;
548     }
549
550     public String getBpmnId() {
551         return bpmnId;
552     }
553
554     public void setBpmnId(String bpmnId) {
555         this.bpmnId = bpmnId;
556     }
557
558     public String getBpmnUserid() {
559         return bpmnUserid;
560     }
561
562     public void setBpmnUserid(String bpmnUserid) {
563         this.bpmnUserid = bpmnUserid;
564     }
565
566     public String getBpmnText() {
567         return bpmnText;
568     }
569
570     public void setBpmnText(String bpmnText) {
571         this.bpmnText = bpmnText;
572     }
573
574     public String getImageId() {
575         return imageId;
576     }
577
578     public void setImageId(String imageId) {
579         this.imageId = imageId;
580     }
581
582     public String getImageUserid() {
583         return imageUserid;
584     }
585
586     public void setImageUserid(String imageUserid) {
587         this.imageUserid = imageUserid;
588     }
589
590     public String getImageText() {
591         return imageText;
592     }
593
594     public void setImageText(String imageText) {
595         this.imageText = imageText;
596     }
597
598     public String getDocId() {
599         return docId;
600     }
601
602     public void setDocId(String docId) {
603         this.docId = docId;
604     }
605
606     public String getDocUserid() {
607         return docUserid;
608     }
609
610     public void setDocUserid(String docUserid) {
611         this.docUserid = docUserid;
612     }
613
614     public String getDocText() {
615         return docText;
616     }
617
618     public void setDocText(String docText) {
619         this.docText = docText;
620     }
621
622     public String getTypeId() {
623         return typeId;
624     }
625
626     public void setTypeId(String typeId) {
627         this.typeId = typeId;
628     }
629
630     public List<CldsModelInstance> getCldsModelInstanceList() {
631         if (cldsModelInstanceList == null) {
632             cldsModelInstanceList = new ArrayList<>();
633         }
634         return cldsModelInstanceList;
635     }
636
637     public void setCldsModelInstanceList(List<CldsModelInstance> cldsModelInstanceList) {
638         this.cldsModelInstanceList = cldsModelInstanceList;
639     }
640
641     public void setDispatcherResponse(String dispatcherResponse) {
642         this.dispatcherResponse = dispatcherResponse;
643
644     }
645
646     public String getDispatcherResponse() {
647         return this.dispatcherResponse;
648     }
649
650     public String getDeploymentId() {
651         return deploymentId;
652     }
653
654     public void setDeploymentId(String deploymentId) {
655         this.deploymentId = deploymentId;
656     }
657
658     public boolean isUserAuthorizedToUpdate() {
659         return userAuthorizedToUpdate;
660     }
661
662     public void setUserAuthorizedToUpdate(boolean userAuthorizedToUpdate) {
663         this.userAuthorizedToUpdate = userAuthorizedToUpdate;
664     }
665 }