summaryrefslogtreecommitdiffstats
path: root/docs/overview.rst
blob: 11ed519b6417b8bd91f998f19833238442b2d2db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. Copyright (C) 2021 Pantheon.tech, Nordix Foundation
.. _overview:

CPS Overview
############

The Configuration Persistence Service (CPS) is a platform component that is designed to serve as a
data repository for runtime data that needs persistence.

Types of data that is stored:

- **Configuration Parameters**

  These are configuration parameters that are used by xNFs during installation & commissioning. Configuration
  parameters are typically used before the xNF has been brought up or is operational. For example, a 5G Network
  configuration parameter for a PNFs that sets the mechanical tilt which is a configuration setting upon
  installation.

- **Operational Parameters**

  This operational information could be either an actual state or configuration of a network service or device.
  These are parameters that are derived, discovered, computed that are used by xNFs during run time AFTER the
  xNF becomes operational i.e. AFTER it has "booted up", been installed or configured. For example, in 5G Network,
  5G PNFs may need to adjust a tower electrical antenna tilt. These operational parameters are Exo-inventory
  information, meaning it is information that doesn't belong in A&AI. In principle, some parameters might be both
  configuration and operational parameters depending on how they are used.

CPS Components
==============

CPS-Core
--------
This is the component of CPS which encompasses the generic storage of Yang module data.

**NCMP**

The Network Configuration Management Proxy (NCMP) provides access to network configuration data and is a part of CPS-Core.
NCMP accesses all network Data-Model-Inventory (DMI) information via NCMP-DMI-Plugins. The ONAP0-DMI-Plugin described in the next section is one such plugin.

**Note:** This documentation will often refer to "CPS-NCMP" which is the component (container image) that contains both CPS-Core and NCMP since NCMP is not a stand-alone component
even though CPS-Core could be deployed without the NCMP extension.

NCMP-DMI-Plugin
---------------

The Data-Model-Inventory (DMI) Plugin is a rest interface used to synchronize CM-Handles data between CPS and DMI through the DMI-Plugin.
This is built previously from the CPS-NF-Proxy component.

CPS Project
===========

* Wiki: `Configuration Persistence Service Project <https://wiki.onap.org/display/DW/Configuration+Persistence+Service+Project>`_
* Contact Information: onap-discuss@lists.onap.org
* Meeting details: `Join  <https://zoom.us/j/836561560?pwd=TTZNcFhXTWYxMmZ4SlgzcVZZQXluUT09>`_ & `Agenda <https://wiki.onap.org/pages/viewpage.action?pageId=111117075>`_
ame.Variable.Magic */ .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ } @media (prefers-color-scheme: light) { .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
/*!
 * Copyright © 2016-2018 European Support Limited
 *
 * 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.
 */
import RestAPIUtil from 'nfvo-utils/RestAPIUtil.js';
import Configuration from 'sdc-app/config/Configuration.js';
import { actionTypes as licenseKeyGroupsConstants } from './LicenseKeyGroupsConstants.js';
import { actionTypes as limitEditorActions } from 'sdc-app/onboarding/licenseModel/limits/LimitEditorConstants.js';
import { default as getValue, getStrValue } from 'nfvo-utils/getValue.js';
import ItemsHelper from 'sdc-app/common/helpers/ItemsHelper.js';
import i18n from 'nfvo-utils/i18n/i18n.js';
import {
    actionTypes as modalActionTypes,
    modalSizes
} from 'nfvo-components/modal/GlobalModalConstants.js';
import { modalContentMapper } from 'sdc-app/common/modal/ModalContentMapper.js';

function baseUrl(licenseModelId, version) {
    const restPrefix = Configuration.get('restPrefix');
    const { id: versionId } = version;
    return `${restPrefix}/v1.0/vendor-license-models/${licenseModelId}/versions/${versionId}/license-key-groups`;
}

function fetchLicenseKeyGroupsList(licenseModelId, version) {
    return RestAPIUtil.fetch(`${baseUrl(licenseModelId, version)}`);
}

function deleteLicenseKeyGroup(licenseModelId, licenseKeyGroupId, version) {
    return RestAPIUtil.destroy(
        `${baseUrl(licenseModelId, version)}/${licenseKeyGroupId}`
    );
}

function postLicenseKeyGroup(licenseModelId, licenseKeyGroup, version) {
    return RestAPIUtil.post(baseUrl(licenseModelId, version), {
        name: licenseKeyGroup.name,
        description: licenseKeyGroup.description,
        type: licenseKeyGroup.type,
        increments: licenseKeyGroup.increments,
        thresholdValue: licenseKeyGroup.thresholdValue,
        thresholdUnits: getValue(licenseKeyGroup.thresholdUnits),
        startDate: licenseKeyGroup.startDate,
        expiryDate: licenseKeyGroup.expiryDate,
        manufacturerReferenceNumber: licenseKeyGroup.manufacturerReferenceNumber
    });
}

function putLicenseKeyGroup(licenseModelId, licenseKeyGroup, version) {
    return RestAPIUtil.put(
        `${baseUrl(licenseModelId, version)}/${licenseKeyGroup.id}`,
        {
            name: licenseKeyGroup.name,
            description: licenseKeyGroup.description,
            type: licenseKeyGroup.type,
            increments: licenseKeyGroup.increments,
            thresholdValue: licenseKeyGroup.thresholdValue,
            thresholdUnits: getValue(licenseKeyGroup.thresholdUnits),
            startDate: licenseKeyGroup.startDate,
            expiryDate: licenseKeyGroup.expiryDate,
            manufacturerReferenceNumber:
                licenseKeyGroup.manufacturerReferenceNumber
        }
    );
}

function fetchLimitsList(licenseModelId, licenseKeyGroupId, version) {
    return RestAPIUtil.fetch(
        `${baseUrl(licenseModelId, version)}/${licenseKeyGroupId}/limits`
    );
}

function deleteLimit(licenseModelId, licenseKeyGroupId, version, limitId) {
    return RestAPIUtil.destroy(
        `${baseUrl(
            licenseModelId,
            version
        )}/${licenseKeyGroupId}/limits/${limitId}`
    );
}

function postLimit(licenseModelId, licenseKeyGroupId, version, limit) {
    return RestAPIUtil.post(
        `${baseUrl(licenseModelId, version)}/${licenseKeyGroupId}/limits`,
        {
            name: limit.name,
            type: limit.type,
            description: limit.description,
            metric: getStrValue(limit.metric),
            value: limit.value,
            unit: getStrValue(limit.unit),
            aggregationFunction: getValue(limit.aggregationFunction),
            time: getValue(limit.time)
        }
    );
}

function putLimit(licenseModelId, licenseKeyGroupId, version, limit) {
    return RestAPIUtil.put(
        `${baseUrl(licenseModelId, version)}/${licenseKeyGroupId}/limits/${
            limit.id
        }`,
        {
            name: limit.name,
            type: limit.type,
            description: limit.description,
            metric: getStrValue(limit.metric),
            value: limit.value,
            unit: getStrValue(limit.unit),
            aggregationFunction: getValue(limit.aggregationFunction),
            time: getValue(limit.time)
        }
    );
}

export default {
    fetchLicenseKeyGroupsList(dispatch, { licenseModelId, version }) {
        return fetchLicenseKeyGroupsList(licenseModelId, version).then(
            response =>
                dispatch({
                    type:
                        licenseKeyGroupsConstants.LICENSE_KEY_GROUPS_LIST_LOADED,
                    response
                })
        );
    },

    openLicenseKeyGroupsEditor(
        dispatch,
        { licenseKeyGroup, licenseModelId, version, isReadOnlyMode } = {}
    ) {
        if (licenseModelId && version && licenseKeyGroup) {
            this.fetchLimits(dispatch, {
                licenseModelId,
                version,
                licenseKeyGroup
            });
        }
        dispatch({
            type: licenseKeyGroupsConstants.licenseKeyGroupsEditor.OPEN,
            licenseKeyGroup
        });
        dispatch({
            type: modalActionTypes.GLOBAL_MODAL_SHOW,
            data: {
                modalComponentName: modalContentMapper.LKG_EDITOR,
                modalComponentProps: {
                    version,
                    licenseModelId,
                    isReadOnlyMode,
                    size: modalSizes.LARGE
                },
                title:
                    licenseModelId && version && licenseKeyGroup
                        ? i18n('Edit License Key Group')
                        : i18n('Create New License Key Group')
            }
        });
    },

    closeLicenseKeyGroupEditor(dispatch) {
        dispatch({
            type: licenseKeyGroupsConstants.licenseKeyGroupsEditor.CLOSE
        });
        dispatch({
            type: modalActionTypes.GLOBAL_MODAL_CLOSE
        });
    },

    async saveLicenseKeyGroup(
        dispatch,
        { licenseModelId, previousLicenseKeyGroup, licenseKeyGroup, version }
    ) {
        if (previousLicenseKeyGroup) {
            await putLicenseKeyGroup(licenseModelId, licenseKeyGroup, version);
        } else {
            await postLicenseKeyGroup(licenseModelId, licenseKeyGroup, version);
        }
        await ItemsHelper.checkItemStatus(dispatch, {
            itemId: licenseModelId,
            versionId: version.id
        });
        await this.fetchLicenseKeyGroupsList(dispatch, {
            licenseModelId,
            version
        });
    },

    async deleteLicenseKeyGroup(
        dispatch,
        { licenseModelId, licenseKeyGroupId, version }
    ) {
        await deleteLicenseKeyGroup(licenseModelId, licenseKeyGroupId, version);
        await ItemsHelper.checkItemStatus(dispatch, {
            itemId: licenseModelId,
            versionId: version.id
        });
        await this.fetchLicenseKeyGroupsList(dispatch, {
            licenseModelId,
            version
        });
    },

    hideDeleteConfirm(dispatch) {
        dispatch({
            type: licenseKeyGroupsConstants.LICENSE_KEY_GROUPS_DELETE_CONFIRM,
            licenseKeyGroupToDelete: false
        });
    },

    openDeleteLicenseAgreementConfirm(dispatch, { licenseKeyGroup }) {
        dispatch({
            type: licenseKeyGroupsConstants.LICENSE_KEY_GROUPS_DELETE_CONFIRM,
            licenseKeyGroupToDelete: licenseKeyGroup
        });
    },

    fetchLimits(dispatch, { licenseModelId, version, licenseKeyGroup }) {
        return fetchLimitsList(
            licenseModelId,
            licenseKeyGroup.id,
            version
        ).then(response => {
            dispatch({
                type:
                    licenseKeyGroupsConstants.licenseKeyGroupsEditor
                        .LIMITS_LIST_LOADED,
                response
            });
        });
    },

    submitLimit(dispatch, { licenseModelId, version, licenseKeyGroup, limit }) {
        const promise = limit.id
            ? putLimit(licenseModelId, licenseKeyGroup.id, version, limit)
            : postLimit(licenseModelId, licenseKeyGroup.id, version, limit);
        return promise.then(() => {
            dispatch({
                type: limitEditorActions.CLOSE
            });
            this.fetchLimits(dispatch, {
                licenseModelId,
                version,
                licenseKeyGroup
            });
            return ItemsHelper.checkItemStatus(dispatch, {
                itemId: licenseModelId,
                versionId: version.id
            });
        });
    },

    deleteLimit(dispatch, { licenseModelId, version, licenseKeyGroup, limit }) {
        return deleteLimit(
            licenseModelId,
            licenseKeyGroup.id,
            version,
            limit.id
        ).then(() => {
            this.fetchLimits(dispatch, {
                licenseModelId,
                version,
                licenseKeyGroup
            });
            return ItemsHelper.checkItemStatus(dispatch, {
                itemId: licenseModelId,
                versionId: version.id
            });
        });
    }
};