Commit 2 for Define OPtimizer API mS 79/83579/1
authorJerry Flood <jflood@att.com>
Thu, 28 Mar 2019 09:51:58 +0000 (05:51 -0400)
committerJerry Flood <jflood@att.com>
Thu, 28 Mar 2019 09:57:15 +0000 (05:57 -0400)
Multiple commits required due to commit size limitation.

Change-Id: I41f8f3160a55ec046dddc1aa861ee0e090674345
Issue-ID: OPTFRA-437
Signed-off-by: Jerry Flood <jflood@att.com>
cmso-optimizer/src/main/java/org/onap/observations/Mdc.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/observations/Observation.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java [new file with mode: 0644]

diff --git a/cmso-optimizer/src/main/java/org/onap/observations/Mdc.java b/cmso-optimizer/src/main/java/org/onap/observations/Mdc.java
new file mode 100644 (file)
index 0000000..0686f59
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
+ */
+
+package org.onap.observations;
+
+import static com.att.eelf.configuration.Configuration.MDC_BEGIN_TIMESTAMP;
+import static com.att.eelf.configuration.Configuration.MDC_END_TIMESTAMP;
+import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
+import static com.att.eelf.configuration.Configuration.MDC_PARTNER_NAME;
+import static com.att.eelf.configuration.Configuration.MDC_REMOTE_HOST;
+import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_CODE;
+import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_DESC;
+import static com.att.eelf.configuration.Configuration.MDC_STATUS_CODE;
+import static com.att.eelf.configuration.Configuration.MDC_TARGET_ENTITY;
+import static com.att.eelf.configuration.Configuration.MDC_TARGET_SERVICE_NAME;
+
+import com.att.eelf.utils.Stopwatch;
+import java.net.URI;
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientResponseContext;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response.StatusType;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.slf4j.MDC;
+
+/**
+ * ECOMP EELF logging MDC fields not defined in the MDC Configuration (i.e. MDC_ALERT_SEVERITY)
+ **/
+public class Mdc {
+
+    /** The Constant SERVICE_NAME. */
+    public static final String SERVICE_NAME = "CSS-Scheduler";
+
+    /**
+     * The Enum Enum.
+     */
+    public enum Enum {
+        // BeginTimestamp,
+        // EndTimeStamp,
+        // RequestId,
+        // ServiceInstanceId,
+        VirtualServerName,
+        // ServiceName,
+        // PartnerName,
+        // StatusCOde,
+        // ResponseCode,
+        // ResponseDescription,
+        // InstanceUUID,
+        // AlertSeverity,
+        // ServerIPAddress,
+        // ElapsedTime,
+        // ServerFQDN,
+        // RemoteHost,
+        ClassName,
+        Unused,
+        // ProcessKey,
+        CustomField1,
+        CustomField2,
+        CustomField3,
+        CustomField4,
+        // TargetVirtualEntity,
+        // TargetEntity,
+        // TargetServiceName,
+        ErrorCode,
+        ErrorDescription,
+        Timer,
+    }
+
+    /**
+     * Gets the caller.
+     *
+     * @param back the back
+     * @return the caller
+     */
+    public static String getCaller(int back) {
+        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
+        return stackTraceElements[back].getClassName() + "." + stackTraceElements[back].getMethodName();
+    }
+
+    /**
+     * Sets the caller.
+     *
+     * @param back the new caller
+     */
+    public static void setCaller(int back) {
+        String caller = MDC.get(Enum.ClassName.name());
+        if (caller == null) {
+            MDC.put(Enum.ClassName.name(), getCaller(back));
+        }
+    }
+
+    /**
+     * Sets the observation.
+     *
+     * @param obs the new observation
+     */
+    public static void setObservation(ObservationInterface obs) {
+        MDC.put(Enum.CustomField4.name(), obs.name());
+    }
+
+    /**
+     * Clear caller.
+     */
+    public static void clearCaller() {
+        MDC.remove(Enum.ClassName.name());
+    }
+
+
+    /**
+     * Save.
+     *
+     * @return the map
+     */
+    public static Map<String, String> save() {
+        Map<String, String> save = MDC.getCopyOfContextMap();
+        return save;
+    }
+
+    /**
+     * Restore.
+     *
+     * @param mdcSave the mdc save
+     */
+    public static void restore(Map<String, String> mdcSave) {
+        MDC.clear();
+        for (String name : mdcSave.keySet()) {
+            MDC.put(name, mdcSave.get(name));
+        }
+    }
+
+
+
+    /**
+     * Sets the request id if not set.
+     *
+     * @param requestId the new request id if not set
+     */
+    public static void setRequestIdIfNotSet(String requestId) {
+        if (MDC.get(MDC_KEY_REQUEST_ID) == null || MDC.get(MDC_KEY_REQUEST_ID).equals("")) {
+            setRequestId(requestId);
+        }
+    }
+
+    /**
+     * Sets the request id.
+     *
+     * @param requestId the new request id
+     */
+    public static void setRequestId(String requestId) {
+        MDC.put(MDC_KEY_REQUEST_ID, requestId);
+    }
+
+    /**
+     * Metric start.
+     *
+     * @param requestContext the request context
+     */
+    public static void metricStart(ClientRequestContext requestContext) {
+        MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+        MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+        setPartnerTargetFromUri(requestContext.getUri());
+    }
+
+    /**
+     * Metric end.
+     *
+     * @param response the response
+     */
+    public static void metricEnd(ClientResponseContext response) {
+
+        Date now = new Date();
+        // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+        MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+        setResponseInfo(response.getStatusInfo());
+
+    }
+
+    /**
+     * Audit start.
+     *
+     * @param requestContext the request context
+     * @param servletRequest the servlet request
+     */
+    public static void auditStart(ContainerRequestContext requestContext, HttpServletRequest servletRequest) {
+        MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+        MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+        MDC.put(MDC_REMOTE_HOST, servletRequest.getRemoteHost());
+        MDC.put(Enum.ClassName.name(), getCaller(4));
+        MultivaluedMap<String, String> headers = requestContext.getHeaders();
+        String transactionId = headers.getFirst(HeadersEnum.TransactionID.toString());
+        if (transactionId != null) {
+            setRequestId(transactionId);
+        } else {
+            setRequestId(UUID.randomUUID().toString());
+        }
+
+    }
+
+    /**
+     * Audit end.
+     *
+     * @param requestContext the request context
+     * @param response the response
+     */
+    public static void auditEnd(ContainerRequestContext requestContext, ContainerResponseContext response) {
+        Date now = new Date();
+        // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+        MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+        MDC.put(Enum.ClassName.name(), getCaller(4));
+
+        setResponseInfo(response.getStatusInfo());
+
+    }
+
+    private static void setResponseInfo(StatusType statusInfo) {
+        Integer status = statusInfo.getStatusCode();
+        String completed = "ERROR";
+        if (status >= 200 && status < 300) {
+            completed = "COMPLETE";
+        }
+        MDC.put(MDC_RESPONSE_CODE, status.toString());
+        MDC.put(MDC_RESPONSE_DESC, statusInfo.getReasonPhrase());
+        MDC.put(MDC_STATUS_CODE, completed);
+    }
+
+    /**
+     * Sets the event.
+     *
+     * @param requestId the new event
+     */
+    public static void setEvent(String requestId) {
+        MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+        MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+        setRequestId(requestId);
+    }
+
+    private static void setPartnerTargetFromUri(URI uri) {
+        try {
+            MDC.put(MDC_PARTNER_NAME, uri.getHost());
+            MDC.put(MDC_TARGET_ENTITY, uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort());
+            MDC.put(MDC_TARGET_SERVICE_NAME, uri.getPath());
+        } catch (Exception e) {
+            MDC.put(MDC_PARTNER_NAME, "UNKNOWN");
+            MDC.put(MDC_TARGET_ENTITY, "UNKNOWN");
+            MDC.put(MDC_TARGET_SERVICE_NAME, "UNKNOWN");
+        }
+    }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java b/cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java
new file mode 100644 (file)
index 0000000..fe6cea2
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
+ */
+
+package org.onap.observations;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * The Class MessageHeaders.
+ */
+public class MessageHeaders {
+
+    /**
+     * The Enum HeadersEnum.
+     */
+    public enum HeadersEnum {
+        UNDEFINED("UNDEFINED"),
+        TransactionID("X-TransactionId"),
+        FromAppID("X-FromAppId"),
+        MinorVersion("X-MinorVersion"),
+        PatchVersion("X-PatchVersion"),
+        LatestVersion("X-LatestVersion"),;
+
+        private final String text;
+
+        private HeadersEnum(String text) {
+            this.text = text;
+        }
+
+        /**
+         * To string.
+         *
+         * @return the string
+         */
+        @Override
+        public String toString() {
+            return text;
+        }
+    }
+
+    /** The Constant supportedMajorVersions. */
+    public static final Map<String, String> supportedMajorVersions = new HashMap<String, String>();
+
+    static {
+        supportedMajorVersions.put("v1", "0");
+        supportedMajorVersions.put("v2", "0");
+    }
+
+    /** The Constant supportedMajorMinorVersions. */
+    public static final Set<String> supportedMajorMinorVersions = new HashSet<String>();
+
+    static {
+        supportedMajorMinorVersions.add("v1.0");
+        supportedMajorMinorVersions.add("v2.0");
+    }
+
+    /** The Constant latestVersion. */
+    public static final String latestVersion = "2.0.0";
+
+    /** The Constant patchVersion. */
+    public static final String patchVersion = "0";
+
+    /**
+     * From string.
+     *
+     * @param text the text
+     * @return the headers enum
+     */
+    public static HeadersEnum fromString(String text) {
+        for (HeadersEnum e : HeadersEnum.values()) {
+            if (e.text.equals(text)) {
+                return e;
+            }
+        }
+        return HeadersEnum.UNDEFINED;
+    }
+
+    /**
+     * Gets the patch version.
+     *
+     * @return the patch version
+     */
+    public static String getPatchVersion() {
+        return patchVersion;
+    }
+
+    /**
+     * Gets the latest version.
+     *
+     * @return the latest version
+     */
+    public static String getLatestVersion() {
+        return latestVersion;
+    }
+
+    /**
+     * Validate major version.
+     *
+     * @param major the major
+     * @return true, if successful
+     */
+    public static boolean validateMajorVersion(String major) {
+        String majorKey = major.toLowerCase();
+        if (!supportedMajorVersions.containsKey(majorKey)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Validate major minor version.
+     *
+     * @param major the major
+     * @param minor the minor
+     * @return true, if successful
+     */
+    public static boolean validateMajorMinorVersion(String major, String minor) {
+        String majorKey = major.toLowerCase();
+        if (!supportedMajorVersions.containsKey(majorKey)) {
+            return false;
+        }
+
+        if (minor != null) {
+            String majorMinorKey = majorKey + "." + minor;
+            return supportedMajorMinorVersions.contains(majorMinorKey);
+        }
+        return true;
+    }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/Observation.java b/cmso-optimizer/src/main/java/org/onap/observations/Observation.java
new file mode 100644 (file)
index 0000000..05fe983
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
+ */
+
+package org.onap.observations;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.apache.log4j.Level;
+import org.onap.optf.cmso.optimizer.Application;
+
+
+/**
+ * The Class Observation.
+ */
+public class Observation {
+    private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+    private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
+    private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
+    private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+    private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+    /**
+     * Report.
+     *
+     * @param obs the o
+     * @param execpt the e
+     * @param arguments the arguments
+     */
+    // *************************************************************************************************
+    public static void report(ObservationInterface obs, Exception execpt, String... arguments) {
+        Mdc.setCaller(4);
+        Mdc.setObservation(obs);
+        if (obs.getAudit()) {
+            audit.info(obs, execpt, arguments);
+        }
+        if (obs.getMetric()) {
+            metrics.info(obs, execpt, arguments);
+        }
+        Level lev = obs.getLevel();
+        switch (lev.toInt()) {
+            case Level.WARN_INT:
+                errors.warn(obs, arguments);
+                debug.debug(obs, execpt, arguments);
+                break;
+            case Level.INFO_INT:
+                log.info(obs, execpt, arguments);
+                debug.debug(obs, execpt, arguments);
+                break;
+            case Level.ERROR_INT:
+                errors.error(obs, arguments);
+                debug.debug(obs, execpt, arguments);
+                break;
+            case Level.TRACE_INT:
+                debug.trace(obs, execpt, arguments);
+                break;
+            case Level.DEBUG_INT:
+                debug.debug(obs, execpt, arguments);
+                break;
+            default:
+                log.info(obs, execpt, arguments);
+        }
+        Mdc.clearCaller();
+    }
+
+    /**
+     * Report.
+     *
+     * @param obs the o
+     * @param arguments the arguments
+     */
+    public static void report(ObservationInterface obs, String... arguments) {
+        Mdc.setCaller(4);
+        Mdc.setObservation(obs);
+        if (obs.getAudit()) {
+            audit.info(obs, arguments);
+        }
+        if (obs.getMetric()) {
+            metrics.info(obs, arguments);
+        }
+        Level levl = obs.getLevel();
+        switch (levl.toInt()) {
+            case Level.WARN_INT:
+                errors.warn(obs, arguments);
+                debug.debug(obs, arguments);
+                break;
+            case Level.INFO_INT:
+                log.info(obs, arguments);
+                debug.debug(obs, arguments);
+                break;
+            case Level.ERROR_INT:
+                errors.error(obs, arguments);
+                debug.debug(obs, arguments);
+                break;
+            case Level.TRACE_INT:
+                debug.debug(obs, arguments);
+                break;
+            case Level.DEBUG_INT:
+                debug.debug(obs, arguments);
+                break;
+            default:
+                log.info(obs, arguments);
+        }
+        Mdc.clearCaller();
+    }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java b/cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java
new file mode 100644 (file)
index 0000000..0dce93d
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
+ */
+
+package org.onap.observations;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+
+public interface ObservationInterface extends EELFResolvableErrorEnum {
+    public Enum<?> getValue();
+
+    public Level getLevel();
+
+    public String getMessage();
+
+    public Status getStatus();
+
+    public String getDomain();
+
+    public String name();
+
+    public Boolean getAudit();
+
+    public Boolean getMetric();
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java b/cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java
new file mode 100644 (file)
index 0000000..f1c1277
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
+ */
+
+package org.onap.observations;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import com.att.eelf.i18n.EELFResourceManager;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+
+
+/**
+ * The Class ObservationObject.
+ */
+public class ObservationObject implements ObservationInterface {
+
+    // *************************************************************************************************
+    // Interface class that matches the ObservationInteface pattern
+    // This will be used in case we decide to provide external overrides and we need to instantiate
+    // For now, we'll just use the Enum itself.
+    //
+    //
+    private Enum<?> value = null;
+
+    private Level level = null;
+    private String message = null;
+    private Status status = null;
+    private String domain = null;
+    private Boolean metric = false;
+    private Boolean audit = false;
+
+    /**
+     * Instantiates a new observation object.
+     *
+     * @param obs the o
+     */
+    public ObservationObject(ObservationInterface obs) {
+        this.value   = obs.getValue();
+        this.level   = obs.getLevel();
+        this.message = obs.getMessage();
+        this.status  = obs.getStatus();
+        this.domain  = obs.getDomain();
+        this.metric  = obs.getMetric();
+        this.audit   = obs.getAudit();
+
+    }
+
+    /**
+     * Gets the value.
+     *
+     * @return the value
+     */
+    @Override
+    public Enum<?> getValue() {
+        return value;
+    }
+
+    /**
+     * Gets the message.
+     *
+     * @return the message
+     */
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    /**
+     * Gets the status.
+     *
+     * @return the status
+     */
+    @Override
+    public Status getStatus() {
+        return status;
+    }
+
+    /**
+     * Gets the domain.
+     *
+     * @return the domain
+     */
+    @Override
+    public String getDomain() {
+        return domain;
+    }
+
+    /**
+     * Gets the level.
+     *
+     * @return the level
+     */
+    @Override
+    public Level getLevel() {
+        return level;
+    }
+
+    /**
+     * Name.
+     *
+     * @return the string
+     */
+    @Override
+    public String name() {
+        return value.name();
+    }
+
+    /**
+     * Gets the audit.
+     *
+     * @return the audit
+     */
+    @Override
+    public Boolean getAudit() {
+        return audit;
+    }
+
+    /**
+     * Gets the metric.
+     *
+     * @return the metric
+     */
+    @Override
+    public Boolean getMetric() {
+        return metric;
+    }
+
+    /**
+     * Gets the message.
+     *
+     * @param arguments the arguments
+     * @return the message
+     */
+    public String getMessagef(String... arguments) {
+        return EELFResourceManager.format((EELFResolvableErrorEnum) value, arguments);
+    }
+
+    /**
+     * Sets the value.
+     *
+     * @param value the new value
+     */
+    public void setValue(Enum<?> value) {
+        this.value = value;
+    }
+
+    /**
+     * Sets the level.
+     *
+     * @param level the new level
+     */
+    public void setLevel(Level level) {
+        this.level = level;
+    }
+
+    /**
+     * Sets the message.
+     *
+     * @param message the new message
+     */
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    /**
+     * Sets the status.
+     *
+     * @param status the new status
+     */
+    public void setStatus(Status status) {
+        this.status = status;
+    }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java
new file mode 100644 (file)
index 0000000..5f873e3
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
+ */
+
+package org.onap.optf.cmso;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.MutablePropertySources;
+
+/**
+ * The Class CMSEnvironmentPostProcessor.
+ */
+public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor {
+    // tested in ONAP springboot and this is called before all of the properties files have been
+    // loaded...
+    // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+    /**
+     * Post process environment.
+     *
+     * @param environment the environment
+     * @param application the application
+     */
+    // proeprties files.
+    @Override
+    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+        String pwd = environment.getProperty("cmso.database.password");
+        if (pwd != null) {
+            pwd = PropertiesManagement.getDecryptedValue(pwd);
+            Map<String, Object> map = new HashMap<String, Object>();
+            map.put("spring.datasource.password", pwd);
+            MapPropertySource propertySource = new MapPropertySource("abc", map);
+            MutablePropertySources proeprtySources = environment.getPropertySources();
+            proeprtySources.addLast(propertySource);
+        }
+    }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
new file mode 100644 (file)
index 0000000..ba9aa6d
--- /dev/null
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.aaf.cadi.CadiWrap;
+import org.onap.aaf.cadi.Permission;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.SpringProfiles;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+/**
+ * AAF authorization filter.
+ */
+
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafAuthorizationFilter extends OrderedRequestContextFilter {
+
+    @Autowired
+    AafUserRoleProperties userRoleProperties;
+
+    /**
+     * Instantiates a new aaf authorization filter.
+     */
+    public AafAuthorizationFilter() {
+        this.setOrder(FilterPriority.AAF_AUTHORIZATION.getPriority());
+
+
+    }
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+                    throws IOException, ServletException {
+        try {
+            if (request instanceof CadiWrap) {
+                CadiWrap cw = (CadiWrap) request;
+                List<Permission> perms = cw.getPermissions(cw.getUserPrincipal());
+                if (userRoleProperties.processPermissions(request, perms)) {
+                    filterChain.doFilter(request, response);
+                } else {
+                    Observation.report(LogMessages.UNAUTHORIZED);
+                    ResponseFormatter.errorResponse(request, response, new CmsoException(
+                                    LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+                }
+            } else {
+                throw new Exception();
+            }
+        } catch (Exception e) {
+            Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+            ResponseFormatter.errorResponse(request, response,
+                            new CmsoException(LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+        }
+    }
+}