Merge "[daisy] Support doctor in daisy master branch"
authorSerena Feng <feng.xiaowei@zte.com.cn>
Wed, 4 Apr 2018 07:07:13 +0000 (07:07 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Wed, 4 Apr 2018 07:07:13 +0000 (07:07 +0000)
112 files changed:
docs/release/index.rst
docs/release/release-automation.rst [new file with mode: 0644]
jjb/apex/apex-deploy.sh
jjb/apex/apex-download-artifact.sh
jjb/apex/apex-jjb-renderer.py
jjb/apex/apex-project-jobs.yml
jjb/apex/apex-verify-jobs.yml
jjb/apex/apex.yml
jjb/apex/apex.yml.j2
jjb/apex/scenarios.yaml.hidden
jjb/bottlenecks/bottlenecks-ci-jobs.yml
jjb/clover/clover-project.yml [new file with mode: 0644]
jjb/compass4nfv/compass-ci-jobs.yml
jjb/container4nfv/container4nfv-project.yml
jjb/container4nfv/yardstick-arm64.yml
jjb/daisy4nfv/daisy-daily-jobs.yml
jjb/daisy4nfv/daisy-project-jobs.yml
jjb/daisy4nfv/daisy4nfv-merge-jobs.yml
jjb/daisy4nfv/daisy4nfv-verify-jobs.yml
jjb/dovetail/dovetail-run.sh
jjb/functest/functest-alpine.sh
jjb/functest/functest-daily-jobs.yml
jjb/functest/functest-docker.yml
jjb/functest/functest-env-presetup.sh
jjb/functest/functest-k8.sh
jjb/functest/functest-kubernetes-project-jobs.yml
jjb/functest/functest-project-jobs.yml
jjb/global/basic-jobs.yml
jjb/global/slave-params.yml
jjb/joid/joid-daily-jobs.yml
jjb/joid/joid-verify-jobs.yml
jjb/opnfvdocs/project.cfg
jjb/qtip/qtip-validate-jobs.yml
jjb/releng/opnfv-lint.yml
jjb/releng/releng-release-create-branch.sh [new file with mode: 0644]
jjb/releng/releng-release-jobs.yml [new file with mode: 0644]
jjb/releng/releng-release-verify.sh [new file with mode: 0644]
jjb/xci/bifrost-verify.sh
jjb/xci/xci-merge-jobs.yml
jjb/xci/xci-promote.sh
jjb/xci/xci-run-functest.sh
jjb/xci/xci-set-scenario.sh
jjb/xci/xci-start-new-vm.sh
jjb/xci/xci-verify-jobs.yml
jjb/yardstick/yardstick-daily-jobs.yml
jjb/yardstick/yardstick-get-k8s-conf.sh
releases/euphrates/apex.yaml [new file with mode: 0644]
releases/euphrates/armband.yaml [new file with mode: 0644]
releases/euphrates/availability.yaml [new file with mode: 0644]
releases/euphrates/bamboo.yaml [new file with mode: 0644]
releases/euphrates/barometer.yaml [new file with mode: 0644]
releases/euphrates/bottlenecks.yaml [new file with mode: 0644]
releases/euphrates/calipso.yaml [new file with mode: 0644]
releases/euphrates/compass4nfv.yaml [new file with mode: 0644]
releases/euphrates/container4nfv.yaml [new file with mode: 0644]
releases/euphrates/daisy.yaml [new file with mode: 0644]
releases/euphrates/doctor.yaml [new file with mode: 0644]
releases/euphrates/domino.yaml [new file with mode: 0644]
releases/euphrates/fds.yaml [new file with mode: 0644]
releases/euphrates/fuel.yaml [new file with mode: 0644]
releases/euphrates/functest.yaml [new file with mode: 0644]
releases/euphrates/ipv6.yaml [new file with mode: 0644]
releases/euphrates/joid.yaml [new file with mode: 0644]
releases/euphrates/kvmfornfv.yaml [new file with mode: 0644]
releases/euphrates/moon.yaml [new file with mode: 0644]
releases/euphrates/nfvbench.yaml [new file with mode: 0644]
releases/euphrates/octopus.yaml [new file with mode: 0644]
releases/euphrates/opnfvdocs.yaml [new file with mode: 0644]
releases/euphrates/orchestra.yaml [new file with mode: 0644]
releases/euphrates/ovn4nfv.yaml [new file with mode: 0644]
releases/euphrates/ovno.yaml [new file with mode: 0644]
releases/euphrates/parser.yaml [new file with mode: 0644]
releases/euphrates/pharos.yaml [new file with mode: 0644]
releases/euphrates/promise.yaml [new file with mode: 0644]
releases/euphrates/qtip.yaml [new file with mode: 0644]
releases/euphrates/samplevnf.yaml [new file with mode: 0644]
releases/euphrates/sdnvpn.yaml [new file with mode: 0644]
releases/euphrates/sfc.yaml [new file with mode: 0644]
releases/euphrates/snaps.yaml [new file with mode: 0644]
releases/euphrates/storperf.yaml [new file with mode: 0644]
releases/euphrates/vswitchperf.yaml [new file with mode: 0644]
releases/euphrates/yardstick.yaml [new file with mode: 0644]
releases/fraser/apex.yaml [new file with mode: 0644]
releases/fraser/armband.yml [new file with mode: 0644]
releases/fraser/auto.yaml [new file with mode: 0644]
releases/fraser/availability.yaml [new file with mode: 0644]
releases/fraser/barometer.yaml [new file with mode: 0644]
releases/fraser/bottlenecks.yaml [new file with mode: 0644]
releases/fraser/clover.yaml [new file with mode: 0644]
releases/fraser/compass4nfv.yaml [new file with mode: 0644]
releases/fraser/daisy.yaml [new file with mode: 0644]
releases/fraser/doctor.yaml [new file with mode: 0644]
releases/fraser/fds.yaml [new file with mode: 0644]
releases/fraser/fuel.yaml [new file with mode: 0644]
releases/fraser/functest.yaml [new file with mode: 0644]
releases/fraser/ipv6.yaml [new file with mode: 0644]
releases/fraser/joid.yaml [new file with mode: 0644]
releases/fraser/nfvbench.yaml [new file with mode: 0644]
releases/fraser/ovn4nfv.yaml [new file with mode: 0644]
releases/fraser/samplevnf.yaml [new file with mode: 0644]
releases/fraser/sdnvpn.yaml [new file with mode: 0644]
releases/fraser/sfc.yaml [new file with mode: 0644]
releases/fraser/storperf.yaml [new file with mode: 0644]
releases/fraser/vswitchperf.yaml [new file with mode: 0644]
releases/fraser/yardstick.yaml [new file with mode: 0644]
releases/schema.yaml [new file with mode: 0644]
releases/scripts/create_branch.py [new file with mode: 0644]
releases/scripts/create_jobs.py [new file with mode: 0644]
releases/scripts/defaults.cfg [new file with mode: 0644]
releases/scripts/requirements.txt [new file with mode: 0644]
releases/scripts/verify_schema.py [new file with mode: 0644]
utils/push-test-logs.sh

index d7d8acd..49cd00b 100644 (file)
@@ -13,5 +13,6 @@ Releasing OPNFV
    :maxdepth: 2
 
    release-process
+   release-automation
    stable-branch-guide
    versioning
diff --git a/docs/release/release-automation.rst b/docs/release/release-automation.rst
new file mode 100644 (file)
index 0000000..213e5ad
--- /dev/null
@@ -0,0 +1,163 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. (c) Open Platform for NFV Project, Inc. and its contributors
+
+.. _release-automation:
+
+==================
+Release Automation
+==================
+
+This page describes how projects can take advantage of the release
+automation introduced in Fraser for creating their stable branch, and
+stable branch Jenkins jobs.
+
+It also describes the structures of the ``releases`` directory and the
+associated scripts.
+
+Stable Branch Creation
+----------------------
+
+If your project participated in the last release (beginning with
+Euphrates), perform the following steps:
+
+#. Copy your project's release file to the new release directory. For
+   example::
+
+     cp releases/euphrates/apex.yaml releases/fraser/apex.yaml
+
+#. For projects who are participating the in the stable release process for
+   the first time, you can either copy a different project's file and
+   changing the values to match your project, or use the following
+   template, replacing values marked with ``<`` and ``>``:
+
+   .. code-block:: yaml
+
+       ---
+       project: <opnfv-project-name>
+       project-type: <opnfv-project-type>
+       release-model: stable
+
+       branches:
+         - name: stable/<release>
+           location:
+             <project-repo>: <git-sha1>
+
+#. Modify the file, replacing the previous stable branch name with the
+   new release name, and the commit the branch will start at. For
+   example:
+
+   .. code-block:: yaml
+
+     branches:
+       - name: stable/fraser
+         location:
+           apex: <git-full-sha1>
+
+#. If your project contains multiple repositories, add them to the list
+   of branches. They can also be added later if more time is needed
+   before the stable branch window closes.
+
+   .. code-block:: yaml
+
+     branches:
+       - name: stable/fraser
+         location:
+           apex: <git-sha1>
+       - name: stable/fraser
+         location:
+           apex-puppet-tripleo: <git-sha1>
+
+#. Git add, commit, and git-review the changes. A job will be triggered
+   to verify the commit exists on the branch, and the yaml file follows
+   the scheme listed in ``releases/schema.yaml``
+
+#. Once the commit has been reviewed and merged by Releng, a job will
+   be triggered to create the stable branch Jenkins jobs under
+   ``jjb/``.
+
+
+Stable Release Tagging
+----------------------
+
+TBD
+
+Release File Fields
+-------------------
+
+The following is a description of fields in the Release file, which are
+verified by the scheme file at ``releases/schema.yaml``
+
+project
+  Project team in charge of the release.
+
+release-model
+  Release model the project follows.
+
+  One of: stable, non-release
+
+project-type
+  Classification of project within OPNFV.
+
+  One of: installer, feature, testing, tools, infra
+
+upstream
+  (Optional) Upstream OpenStack project assocated with this project.
+
+releases
+  List of released versions for the project.
+
+  version
+    Version of the release, must be in the format ``opnfv-X.Y.Z``.
+
+  location
+    Combination of repository and git hash to locate the release
+    version.
+
+    Example::
+
+        opnfv-project: f15d50c2009f1f865ac6f4171347940313727547
+
+branches
+   List of stable branches for projects following the ``stable`` release-model.
+
+   name
+     Stable branch name. Must start with the string ``stable/``
+
+   location
+     Same syntax as ``location`` under ``releases``
+
+release-notes
+   Link to release notes for the projects per-release.
+
+
+Scripts
+-------
+
+* ``create_branch.py -f <RELEASE_FILE>``
+
+  Create branches in Gerrit listed in the release file.
+
+  Must be ran from the root directory of the releng repository as the
+  release name is extracted from the subdirectory under ``releases/``
+
+  The Gerrit server can be changed by creating a ``~/releases.cfg``
+  file with the following content::
+
+    [gerrit]
+    url=http://gerrit.example.com
+
+  This will override the default configuration of using the OPNFV
+  Gerrit server at https://gerrit.opnfv.org, and is primarily used for
+  testing.
+
+* ``create_jobs.py -f <RELEASE_FILE>``
+
+  Modifies the jenkins job files for a project to add the stable branch
+  stream. Assumes the jenkins jobs are found in the releng repository
+  under ``jjb/<project>/``
+
+* ``verify_schema -s <SCHEMA_FILE> -y <YAML_FILE>``
+
+  Verifies the yaml file matches the specified jsonschema formatted
+  file. Used to verify the release files under ``releases/``
index 123db3e..94d4642 100755 (executable)
@@ -121,7 +121,7 @@ if [[ "$JOB_NAME" =~ "virtual" ]]; then
     DEPLOY_CMD="${DEPLOY_CMD} -e csit-environment.yaml"
   fi
   if [[ "$PROMOTE" == "True" ]]; then
-    DEPLOY_CMD="${DEPLOY_CMD} --virtual-computes 2"
+    DEPLOY_CMD="${DEPLOY_CMD} --virtual-computes 1"
   fi
 else
   # settings for bare metal deployment
index c12406c..066d612 100755 (executable)
@@ -10,6 +10,26 @@ echo
 
 [[ -d $BUILD_DIRECTORY ]] || mkdir -p $BUILD_DIRECTORY
 
+if [ -z "$DEPLOY_SCENARIO" ]; then
+  echo "Deploy scenario not set!"
+  exit 1
+elif [[ "$DEPLOY_SCENARIO" == *gate* ]]; then
+  echo "Detecting Gating scenario..."
+  if [ -z "$GERRIT_EVENT_COMMENT_TEXT" ]; then
+    echo "ERROR: Gate job triggered without comment!"
+    exit 1
+  else
+    DEPLOY_SCENARIO=$(echo ${GERRIT_EVENT_COMMENT_TEXT} | grep start-gate-scenario | grep -Eo 'os-.*$')
+    if [ -z "$DEPLOY_SCENARIO" ]; then
+      echo "ERROR: Unable to detect scenario in Gerrit Comment!"
+      echo "Format of comment to trigger gate should be 'start-gate-scenario: <scenario>'"
+      exit 1
+    else
+      echo "Gate scenario detected: ${DEPLOY_SCENARIO}"
+    fi
+  fi
+fi
+
 # if upstream we do not need to download anything
 if [[ "$DEPLOY_SCENARIO" =~ upstream ]]; then
   echo "Upstream deployment detected, skipping download artifact"
index 6fd83af..b677843 100644 (file)
@@ -12,30 +12,38 @@ import yaml
 from jinja2 import Environment
 from jinja2 import FileSystemLoader
 
-gspathname = dict()
-branch = dict()
-build_slave = dict()
-env = Environment(loader=FileSystemLoader('./'), autoescape=True)
 
-with open('scenarios.yaml.hidden') as _:
-    scenarios = yaml.safe_load(_)
+def render_jjb():
+    """Render JJB output from scenarios.yaml.hidden file and jinja
+    template"""
 
-template = env.get_template('apex.yml.j2')
+    gspathname = dict()
+    branch = dict()
+    build_slave = dict()
+    env = Environment(loader=FileSystemLoader('./'), autoescape=True)
 
-print("Scenarios are: ")
-pprint.pprint(scenarios)
+    with open('scenarios.yaml.hidden') as _:
+        scenarios = yaml.safe_load(_)
 
-for stream in scenarios:
-    if stream == 'master':
-        gspathname['master'] = ''
-        branch[stream] = stream
-    else:
-        gspathname[stream] = '/' + stream
-        branch[stream] = 'stable/' + stream
-    build_slave[stream] = 'apex-baremetal-{}'.format(stream)
+    template = env.get_template('apex.yml.j2')
 
-output = template.render(scenarios=scenarios, gspathname=gspathname,
-                         branch=branch, build_slave=build_slave)
+    print("Scenarios are: ")
+    pprint.pprint(scenarios)
 
-with open('./apex.yml', 'w') as fh:
-    fh.write(output)
+    for stream in scenarios:
+        if stream == 'master':
+            gspathname['master'] = ''
+            branch[stream] = stream
+        else:
+            gspathname[stream] = '/' + stream
+            branch[stream] = 'stable/' + stream
+        build_slave[stream] = 'apex-baremetal-{}'.format(stream)
+
+    output = template.render(scenarios=scenarios, gspathname=gspathname,
+                             branch=branch, build_slave=build_slave)
+
+    with open('./apex.yml', 'w') as fh:
+        fh.write(output)
+
+if __name__ == "__main__":
+    render_jjb()
index 5807286..700ff60 100644 (file)
@@ -9,6 +9,11 @@
           gs-pathname: ''
           concurrent-builds: 3
           disabled: false
+      - fraser: &fraser
+          branch: 'stable/{stream}'
+          gs-pathname: '/{stream}'
+          concurrent-builds: 3
+          disabled: false
       - euphrates: &euphrates
           branch: 'stable/euphrates'
           gs-pathname: '/euphrates'
index 3029322..3a693c8 100644 (file)
           gs-pathname: ''
           verify-scenario: 'os-odl-nofeature-ha'
           disabled: false
+      - fraser: &fraser
+          branch: 'stable/{stream}'
+          gs-pathname: '/{stream}'
+          verify-scenario: 'os-odl-nofeature-ha'
+          disabled: false
       - danube: &danube
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
index e19a90e..a4c6860 100644 (file)
           verify-scenario: 'os-odl-nofeature-ha'
           scenario_stream: 'master'
           disable_daily: false
+          disable_promote: false
+      - fraser: &fraser
+          branch: 'stable/fraser'
+          gs-pathname: '/fraser'
+          build-slave: 'apex-build-master'
+          virtual-slave: 'apex-virtual-master'
+          baremetal-slave: 'apex-baremetal-master'
+          verify-scenario: 'os-odl-nofeature-ha'
+          scenario_stream: 'fraser'
+          disable_daily: true
+          disable_promote: true
       - euphrates: &euphrates
           branch: 'stable/euphrates'
           gs-pathname: '/euphrates'
@@ -36,6 +47,7 @@
           verify-scenario: 'os-odl-nofeature-ha'
           scenario_stream: 'euphrates'
           disable_daily: true
+          disable_promote: true
       - danube: &danube
           branch: 'stable/danube'
           gs-pathname: '/danube'
           scenario_stream: 'danube'
           disabled: true
           disable_daily: true
+          disable_promote: true
 
     scenario:
+      - 'os-nosdn-nofeature-noha':
+          <<: *fraser
+      - 'os-nosdn-nofeature-ha':
+          <<: *fraser
+      - 'os-odl-nofeature-ha':
+          <<: *fraser
+      - 'os-odl-nofeature-noha':
+          <<: *fraser
+      - 'os-odl-bgpvpn-ha':
+          <<: *fraser
+      - 'os-ovn-nofeature-noha':
+          <<: *fraser
+      - 'os-nosdn-fdio-noha':
+          <<: *fraser
+      - 'os-nosdn-fdio-ha':
+          <<: *fraser
+      - 'os-nosdn-bar-ha':
+          <<: *fraser
+      - 'os-nosdn-bar-noha':
+          <<: *fraser
+      - 'os-nosdn-nofeature-ha-ipv6':
+          <<: *fraser
+      - 'os-nosdn-ovs_dpdk-noha':
+          <<: *fraser
+      - 'os-nosdn-ovs_dpdk-ha':
+          <<: *fraser
+      - 'os-nosdn-kvm_ovs_dpdk-noha':
+          <<: *fraser
+      - 'os-nosdn-kvm_ovs_dpdk-ha':
+          <<: *fraser
+      - 'os-odl-sfc-noha':
+          <<: *fraser
+      - 'os-odl-sfc-ha':
+          <<: *fraser
+      - 'os-nosdn-calipso-noha':
+          <<: *fraser
       - 'os-nosdn-nofeature-noha':
           <<: *danube
       - 'os-nosdn-nofeature-ha':
       - 'baremetal'
       - 'virtual'
 
+    os_version:
+      - 'pike'
+      - 'queens'
+      - 'master'
 - job-template:
     name: 'apex-runner-cperf-{stream}'
 
     #     branch:    branch (eg. stable)
     node: '{virtual-slave}'
     project-type: 'multijob'
-    disabled: false
+    disabled: '{disable_promote}'
 
     scm:
       - git-scm
       - timed: '0 12 * * 0'
 
     builders:
-      - multijob:
-          name: build
-          condition: SUCCESSFUL
-          projects:
-            - name: 'apex-build-{stream}'
-              current-parameters: false
-              predefined-parameters: |
-                GERRIT_BRANCH=$GERRIT_BRANCH
-                GERRIT_REFSPEC=$GERRIT_REFSPEC
-                GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
-                GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
-              node-parameters: false
-              kill-phase-on: FAILURE
-              abort-all-job: true
-              git-revision: true
       - multijob:
           name: deploy-virtual
           condition: SUCCESSFUL
             - name: 'apex-deploy-virtual-{stream}'
               current-parameters: false
               predefined-parameters: |
-                DEPLOY_SCENARIO=os-odl_l3-csit-noha
+                DEPLOY_SCENARIO=os-odl-{os_version}_upstream-noha
                 OPNFV_CLEAN=yes
                 GERRIT_BRANCH=$GERRIT_BRANCH
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
             - name: 'functest-apex-virtual-suite-{stream}'
               current-parameters: false
               predefined-parameters: |
-                DEPLOY_SCENARIO=os-odl_l3-nofeature-noha
+                DEPLOY_SCENARIO=os-odl-{os_version}_upstream-noha
                 FUNCTEST_SUITE_NAME=tempest_smoke_serial
                 GERRIT_BRANCH=$GERRIT_BRANCH
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
 # builder macros
 ########################
 
+# fraser Builder
+- builder:
+    name: apex-builder-fraser
+    builders:
+      - multijob:
+          name: Baremetal Deploy and Test Phase
+          condition: SUCCESSFUL
+          projects:
+            - name: 'apex-os-nosdn-nofeature-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-nofeature-ha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-odl-nofeature-ha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-odl-nofeature-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-odl-bgpvpn-ha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-ovn-nofeature-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-fdio-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-fdio-ha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-bar-ha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-bar-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-nofeature-ha-ipv6-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-ovs_dpdk-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-ovs_dpdk-ha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-kvm_ovs_dpdk-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-kvm_ovs_dpdk-ha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-odl-sfc-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-odl-sfc-ha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+            - name: 'apex-os-nosdn-calipso-noha-baremetal-fraser'
+              node-parameters: false
+              current-parameters: false
+              predefined-parameters: |
+                OPNFV_CLEAN=yes
+              kill-phase-on: NEVER
+              abort-all-job: true
+              git-revision: false
+
 # danube Builder
 - builder:
     name: apex-builder-danube
     triggers:
       - timed: '0 0 1-31/2 * *'
 
+- trigger:
+    name: 'apex-fraser'
+    triggers:
+      - timed: '0 0 2-30/2 * *'
+
 - trigger:
     name: 'apex-euphrates'
     triggers:
index ecc6f27..25b9cd9 100644 (file)
           verify-scenario: 'os-odl-nofeature-ha'
           scenario_stream: 'master'
           disable_daily: false
+          disable_promote: false
+      - fraser: &fraser
+          branch: 'stable/fraser'
+          gs-pathname: '/fraser'
+          build-slave: 'apex-build-master'
+          virtual-slave: 'apex-virtual-master'
+          baremetal-slave: 'apex-baremetal-master'
+          verify-scenario: 'os-odl-nofeature-ha'
+          scenario_stream: 'fraser'
+          disable_daily: true
+          disable_promote: true
       - euphrates: &euphrates
           branch: 'stable/euphrates'
           gs-pathname: '/euphrates'
@@ -36,6 +47,7 @@
           verify-scenario: 'os-odl-nofeature-ha'
           scenario_stream: 'euphrates'
           disable_daily: true
+          disable_promote: true
       - danube: &danube
           branch: 'stable/danube'
           gs-pathname: '/danube'
@@ -46,6 +58,7 @@
           scenario_stream: 'danube'
           disabled: true
           disable_daily: true
+          disable_promote: true
 
     scenario:
       {%- for stream in scenarios %}
       - 'baremetal'
       - 'virtual'
 
+    os_version:
+      - 'pike'
+      - 'queens'
+      - 'master'
 - job-template:
     name: 'apex-runner-cperf-{stream}'
 
     #     branch:    branch (eg. stable)
     node: '{virtual-slave}'
     project-type: 'multijob'
-    disabled: false
+    disabled: '{disable_promote}'
 
     scm:
       - git-scm
       - timed: '0 12 * * 0'
 
     builders:
-      - multijob:
-          name: build
-          condition: SUCCESSFUL
-          projects:
-            - name: 'apex-build-{stream}'
-              current-parameters: false
-              predefined-parameters: |
-                GERRIT_BRANCH=$GERRIT_BRANCH
-                GERRIT_REFSPEC=$GERRIT_REFSPEC
-                GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
-                GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
-              node-parameters: false
-              kill-phase-on: FAILURE
-              abort-all-job: true
-              git-revision: true
       - multijob:
           name: deploy-virtual
           condition: SUCCESSFUL
             - name: 'apex-deploy-virtual-{stream}'
               current-parameters: false
               predefined-parameters: |
-                DEPLOY_SCENARIO=os-odl_l3-csit-noha
+                DEPLOY_SCENARIO=os-odl-{os_version}_upstream-noha
                 OPNFV_CLEAN=yes
                 GERRIT_BRANCH=$GERRIT_BRANCH
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
             - name: 'functest-apex-virtual-suite-{stream}'
               current-parameters: false
               predefined-parameters: |
-                DEPLOY_SCENARIO=os-odl_l3-nofeature-noha
+                DEPLOY_SCENARIO=os-odl-{os_version}_upstream-noha
                 FUNCTEST_SUITE_NAME=tempest_smoke_serial
                 GERRIT_BRANCH=$GERRIT_BRANCH
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
     triggers:
       - timed: '0 0 1-31/2 * *'
 
+- trigger:
+    name: 'apex-fraser'
+    triggers:
+      - timed: '0 0 2-30/2 * *'
+
 - trigger:
     name: 'apex-euphrates'
     triggers:
index 93ce931..58f1c64 100644 (file)
@@ -19,6 +19,25 @@ master:
   - 'os-odl-sfc-noha'
   - 'os-odl-sfc-ha'
   - 'os-nosdn-calipso-noha'
+fraser:
+  - 'os-nosdn-nofeature-noha'
+  - 'os-nosdn-nofeature-ha'
+  - 'os-odl-nofeature-ha'
+  - 'os-odl-nofeature-noha'
+  - 'os-odl-bgpvpn-ha'
+  - 'os-ovn-nofeature-noha'
+  - 'os-nosdn-fdio-noha'
+  - 'os-nosdn-fdio-ha'
+  - 'os-nosdn-bar-ha'
+  - 'os-nosdn-bar-noha'
+  - 'os-nosdn-nofeature-ha-ipv6'
+  - 'os-nosdn-ovs_dpdk-noha'
+  - 'os-nosdn-ovs_dpdk-ha'
+  - 'os-nosdn-kvm_ovs_dpdk-noha'
+  - 'os-nosdn-kvm_ovs_dpdk-ha'
+  - 'os-odl-sfc-noha'
+  - 'os-odl-sfc-ha'
+  - 'os-nosdn-calipso-noha'
 euphrates:
   - 'os-nosdn-nofeature-noha'
   - 'os-nosdn-nofeature-ha'
index 367bb64..072117a 100644 (file)
@@ -78,6 +78,7 @@
       - 'posca_feature_moon_resources'
       - 'posca_feature_moon_tenants'
       - 'posca_feature_vnf_scale_out'
+      - 'posca_factor_soak_throughputs'
 
     jobs:
       - 'bottlenecks-{installer}-{suite}-{pod}-daily-{stream}'
diff --git a/jjb/clover/clover-project.yml b/jjb/clover/clover-project.yml
new file mode 100644 (file)
index 0000000..b31f3de
--- /dev/null
@@ -0,0 +1,166 @@
+---
+###################################################
+# All the jobs except verify have been removed!
+# They will only be enabled on request by projects!
+###################################################
+- project:
+    name: clover
+
+    project: '{name}'
+
+    jobs:
+      - 'clover-verify-{stream}'
+      - 'clover-daily-upload-{stream}'
+      - 'clover-daily-deploy-{stream}'
+
+    stream:
+      - master:
+          branch: '{stream}'
+          gs-pathname: ''
+          disabled: false
+
+- job-template:
+    name: 'clover-verify-{stream}'
+
+    disabled: '{obj:disabled}'
+
+    parameters:
+      - project-parameter:
+          project: '{project}'
+          branch: '{branch}'
+      # yamllint disable rule:line-length
+      - string:
+          name: GIT_BASE
+          default: https://gerrit.opnfv.org/gerrit/$PROJECT
+          description: "Used for overriding the GIT URL coming from Global Jenkins configuration in case if the stuff is done on none-LF HW."
+      # yamllint enable rule:line-length
+      - 'opnfv-build-ubuntu-defaults'
+
+    scm:
+      - git-scm-gerrit
+
+    triggers:
+      - gerrit:
+          server-name: 'gerrit.opnfv.org'
+          trigger-on:
+            - patchset-created-event:
+                exclude-drafts: 'false'
+                exclude-trivial-rebase: 'false'
+                exclude-no-code-change: 'false'
+            - draft-published-event
+            - comment-added-contains-event:
+                comment-contains-value: 'recheck'
+            - comment-added-contains-event:
+                comment-contains-value: 'reverify'
+          projects:
+            - project-compare-type: 'ANT'
+              project-pattern: '{project}'
+              branches:
+                - branch-compare-type: 'ANT'
+                  branch-pattern: '**/{branch}'
+              disable-strict-forbidden-file-verification: 'true'
+              forbidden-file-paths:
+                - compare-type: ANT
+                  pattern: 'docs/**|.gitignore'
+
+    builders:
+      - shell: |
+          cd $WORKSPACE/ci
+          ./verify.sh
+
+- job-template:
+    name: 'clover-daily-upload-{stream}'
+
+    disabled: '{obj:disabled}'
+
+    concurrent: false
+
+    scm:
+      - git-scm
+
+    triggers:
+      - timed: '0 11 * * *'
+
+    wrappers:
+      - fix-workspace-permissions
+
+    parameters:
+      - project-parameter:
+          project: '{project}'
+          branch: '{branch}'
+      - 'opnfv-build-ubuntu-defaults'
+      - 'clover-defaults':
+          gs-pathname: '{gs-pathname}'
+
+    builders:
+      - shell: |
+          cd $WORKSPACE/ci
+          ./upload.sh
+
+- job-template:
+    name: 'clover-daily-deploy-{stream}'
+
+    project-type: freestyle
+
+    disabled: '{obj:disabled}'
+
+    concurrent: false
+
+    properties:
+      - logrotate-default
+      - throttle:
+          enabled: true
+          max-per-node: 1
+          option: 'project'
+      - build-blocker:
+          use-build-blocker: true
+          blocking-jobs:
+            - 'clover-daily-deploy-.*?'
+            - 'container4nfv-daily-deploy-.*?'
+          block-level: 'NODE'
+
+    wrappers:
+      - timeout:
+          timeout: 180
+          abort: true
+      - fix-workspace-permissions
+
+    parameters:
+      - project-parameter:
+          project: '{project}'
+          branch: '{branch}'
+      # yamllint disable rule:line-length
+      - string:
+          name: GIT_BASE
+          default: https://gerrit.opnfv.org/gerrit/$PROJECT
+          description: "Used for overriding the GIT URL coming from Global Jenkins configuration in case if the stuff is done on none-LF HW."
+      # yamllint enable rule:line-length
+      - node:
+          name: SLAVE_NAME
+          description: 'Slave name on Jenkins'
+          allowed-slaves:
+            - huawei-virtual6
+          default-slaves:
+            - huawei-virtual6
+
+    scm:
+      - git-scm
+
+    triggers:
+      - timed: '0 12 * * *'
+
+    builders:
+      - shell: |
+          cd $WORKSPACE/ci
+          ./deploy.sh
+
+###################
+# parameter macros
+###################
+- parameter:
+    name: 'clover-defaults'
+    parameters:
+      - string:
+          name: GS_URL
+          default: artifacts.opnfv.org/$PROJECT{gs-pathname}
+          description: "URL to Google Storage."
index 2ef4388..0d5f92c 100644 (file)
       ppa-pathname: '/{stream}'
       disabled: false
       openstack-version: pike
-    euphrates: &euphrates
-      stream: euphrates
+    fraser: &fraser
+      stream: fraser
       branch: 'stable/{stream}'
       disabled: false
       gs-pathname: '/{stream}'
       ppa-pathname: '/{stream}'
-      openstack-version: ocata
+      openstack-version: pike
     danube: &danube
       stream: danube
       branch: 'stable/{stream}'
       - baremetal:
           slave-label: compass-baremetal-branch
           os-version: 'xenial'
-          <<: *euphrates
+          <<: *fraser
       - virtual:
           slave-label: compass-virtual-branch
           os-version: 'xenial'
-          <<: *euphrates
+          <<: *fraser
       # -------------------------------
       #        master
       # -------------------------------
@@ -69,9 +69,6 @@
       - 'os-nosdn-nofeature-ha':
           disabled: false
           auto-trigger-name: 'compass-{scenario}-{pod}-{stream}-trigger'
-      - 'os-odl_l2-nofeature-ha':
-          disabled: false
-          auto-trigger-name: 'compass-{scenario}-{pod}-{stream}-trigger'
       - 'os-odl_l3-nofeature-ha':
           disabled: false
           auto-trigger-name: 'compass-{scenario}-{pod}-{stream}-trigger'
                     build-step-failure-threshold: 'never'
                     failure-threshold: 'never'
                     unstable-threshold: 'FAILURE'
+                - project: 'bottlenecks-compass-posca_factor_soak_throughputs-{pod}-daily-{stream}'
+                  current-parameters: false
+                  predefined-parameters:
+                    DEPLOY_SCENARIO={scenario}
+                  block: true
+                  same-node: true
+                  block-thresholds:
+                    build-step-failure-threshold: 'never'
+                    failure-threshold: 'never'
+                    unstable-threshold: 'FAILURE'
       - conditional-step:
           condition-kind: and
           condition-operands:
                 !include-raw-escape: ./compass-deploy.sh
       - conditional-step:
           condition-kind: regex-match
-          regex: (danube|euphrates)
+          regex: (danube|fraser)
           label: '{stream}'
           steps:
             - shell:
     name: 'compass-os-nosdn-openo-ha-baremetal-centos-master-trigger'
     triggers:
       - timed: ''
-- trigger:
-    name: 'compass-os-odl_l2-nofeature-ha-baremetal-centos-master-trigger'
-    triggers:
-      - timed: ''
 - trigger:
     name: 'compass-os-odl_l3-nofeature-ha-baremetal-centos-master-trigger'
     triggers:
     name: 'compass-os-nosdn-openo-ha-huawei-pod7-danube-trigger'
     triggers:
       - timed: ''
-- trigger:
-    name: 'compass-os-odl_l2-nofeature-ha-huawei-pod7-danube-trigger'
-    triggers:
-      - timed: ''  # '0 21 * * *'
 - trigger:
     name: 'compass-os-odl_l3-nofeature-ha-huawei-pod7-danube-trigger'
     triggers:
     name: 'compass-os-nosdn-openo-ha-baremetal-master-trigger'
     triggers:
       - timed: ''
-- trigger:
-    name: 'compass-os-odl_l2-nofeature-ha-baremetal-master-trigger'
-    triggers:
-      - timed: ''
 - trigger:
     name: 'compass-os-odl_l3-nofeature-ha-baremetal-master-trigger'
     triggers:
 - trigger:
     name: 'compass-os-odl_l2-moon-ha-baremetal-master-trigger'
     triggers:
-      - timed: '0 12 2-30/2 * *'
+      - timed: ''  # '0 12 2-30/2 * *'
 - trigger:
     name: 'compass-os-nosdn-kvm-ha-baremetal-master-trigger'
     triggers:
       - timed: ''
 
 # -------------------
-# ha-baremetal-euphrates
+# ha-baremetal-fraser
 # -------------------
 - trigger:
-    name: 'compass-os-nosdn-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '0 1 1-29/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-openo-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-openo-ha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-odl_l2-nofeature-ha-baremetal-euphrates-trigger'
-    triggers:
-      - timed: ''
-- trigger:
-    name: 'compass-os-odl_l3-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-odl_l3-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '0 21 2-30/2 * *'
 - trigger:
-    name: 'compass-os-onos-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-onos-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-ocl-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-ocl-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-onos-sfc-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-onos-sfc-ha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-odl_l2-moon-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-odl_l2-moon-ha-baremetal-fraser-trigger'
     triggers:
-      - timed: '0 5 1-29/2 * *'
+      - timed: ''  # '0 5 1-29/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-kvm-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-kvm-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '0 13 2-30/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-ovs_dpdk-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-ovs_dpdk-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '0 9 1-29/2 * *'
 - trigger:
-    name: 'compass-k8-nosdn-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'compass-k8-nosdn-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-odl-sfc-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-odl-sfc-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '0 17 2-30/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-bar-ha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-bar-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '0 21 1-29/2 * *'
 - trigger:
-    name: 'compass-k8-nosdn-stor4nfv-ha-baremetal-euphrates-trigger'
+    name: 'compass-k8-nosdn-stor4nfv-ha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 
 # ---------------------
-# noha-baremetal-euphrates
+# noha-baremetal-fraser
 # ---------------------
 - trigger:
-    name: 'compass-os-nosdn-kvm-noha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-kvm-noha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-nosdn-nofeature-noha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-nofeature-noha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-odl_l3-nofeature-noha-baremetal-euphrates-trigger'
+    name: 'compass-os-odl_l3-nofeature-noha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-odl_l2-moon-noha-baremetal-euphrates-trigger'
+    name: 'compass-os-odl_l2-moon-noha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-odl-sfc-noha-baremetal-euphrates-trigger'
+    name: 'compass-os-odl-sfc-noha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-nosdn-ovs_dpdk-noha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-ovs_dpdk-noha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-nosdn-bar-noha-baremetal-euphrates-trigger'
+    name: 'compass-os-nosdn-bar-noha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-k8-nosdn-stor4nfv-noha-baremetal-euphrates-trigger'
+    name: 'compass-k8-nosdn-stor4nfv-noha-baremetal-fraser-trigger'
     triggers:
       - timed: ''
 
     name: 'compass-os-nosdn-openo-ha-virtual-master-trigger'
     triggers:
       - timed: ''
-- trigger:
-    name: 'compass-os-odl_l2-nofeature-ha-virtual-master-trigger'
-    triggers:
-      - timed: ''
 - trigger:
     name: 'compass-os-odl_l3-nofeature-ha-virtual-master-trigger'
     triggers:
 - trigger:
     name: 'compass-os-odl_l2-moon-ha-virtual-master-trigger'
     triggers:
-      - timed: '30 12 1-29/2 * *'
+      - timed: ''  # '30 12 1-29/2 * *'
 - trigger:
     name: 'compass-os-nosdn-kvm-ha-virtual-master-trigger'
     triggers:
 - trigger:
     name: 'compass-os-odl_l2-moon-noha-virtual-master-trigger'
     triggers:
-      - timed: '0 18 2-30/2 * *'
+      - timed: ''  # '0 18 2-30/2 * *'
 - trigger:
     name: 'compass-os-odl-sfc-noha-virtual-master-trigger'
     triggers:
       - timed: '0 10 2-30/2 * *'
 
 # -----------------
-# ha-virtual-euphrates
+# ha-virtual-fraser
 # -----------------
 - trigger:
-    name: 'compass-os-nosdn-nofeature-ha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-nofeature-ha-virtual-fraser-trigger'
     triggers:
       - timed: '0 23 1-29/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-openo-ha-virtual-euphrates-trigger'
-    triggers:
-      - timed: ''
-- trigger:
-    name: 'compass-os-odl_l2-nofeature-ha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-openo-ha-virtual-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-odl_l3-nofeature-ha-virtual-euphrates-trigger'
+    name: 'compass-os-odl_l3-nofeature-ha-virtual-fraser-trigger'
     triggers:
       - timed: '0 22 2-30/2 * *'
 - trigger:
-    name: 'compass-os-onos-nofeature-ha-virtual-euphrates-trigger'
+    name: 'compass-os-onos-nofeature-ha-virtual-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-ocl-nofeature-ha-virtual-euphrates-trigger'
+    name: 'compass-os-ocl-nofeature-ha-virtual-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-onos-sfc-ha-virtual-euphrates-trigger'
+    name: 'compass-os-onos-sfc-ha-virtual-fraser-trigger'
     triggers:
       - timed: ''
 - trigger:
-    name: 'compass-os-odl_l2-moon-ha-virtual-euphrates-trigger'
+    name: 'compass-os-odl_l2-moon-ha-virtual-fraser-trigger'
     triggers:
       - timed: '0 20 1-29/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-kvm-ha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-kvm-ha-virtual-fraser-trigger'
     triggers:
       - timed: '0 16 2-30/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-ovs_dpdk-ha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-ovs_dpdk-ha-virtual-fraser-trigger'
     triggers:
       - timed: '0 14 1-29/2 * *'
 - trigger:
-    name: 'compass-os-odl-sfc-ha-virtual-euphrates-trigger'
+    name: 'compass-os-odl-sfc-ha-virtual-fraser-trigger'
     triggers:
       - timed: '0 18 2-30/2 * *'
 - trigger:
-    name: 'compass-k8-nosdn-nofeature-ha-virtual-euphrates-trigger'
+    name: 'compass-k8-nosdn-nofeature-ha-virtual-fraser-trigger'
     triggers:
       - timed: '5 1 2-30/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-bar-ha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-bar-ha-virtual-fraser-trigger'
     triggers:
       - timed: '0 19 1-29/2 * *'
 - trigger:
-    name: 'compass-k8-nosdn-stor4nfv-ha-virtual-euphrates-trigger'
+    name: 'compass-k8-nosdn-stor4nfv-ha-virtual-fraser-trigger'
     triggers:
-      - timed: ''  # '0 14 1-29/2 * *'
+      - timed: '0 15 1-29/2 * *'
 
 # -------------------
-# noha-virtual-euphrates
+# noha-virtual-fraser
 # -------------------
 - trigger:
-    name: 'compass-os-nosdn-kvm-noha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-kvm-noha-virtual-fraser-trigger'
     triggers:
       - timed: '0 15 1-29/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-nofeature-noha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-nofeature-noha-virtual-fraser-trigger'
     triggers:
       - timed: '0 17 2-30/2 * *'
 - trigger:
-    name: 'compass-os-odl_l3-nofeature-noha-virtual-euphrates-trigger'
+    name: 'compass-os-odl_l3-nofeature-noha-virtual-fraser-trigger'
     triggers:
       - timed: '0 23 1-29/2 * *'
 - trigger:
-    name: 'compass-os-odl_l2-moon-noha-virtual-euphrates-trigger'
+    name: 'compass-os-odl_l2-moon-noha-virtual-fraser-trigger'
     triggers:
       - timed: '0 21 2-30/2 * *'
 - trigger:
-    name: 'compass-os-odl-sfc-noha-virtual-euphrates-trigger'
+    name: 'compass-os-odl-sfc-noha-virtual-fraser-trigger'
     triggers:
       - timed: '0 19 1-29/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-ovs_dpdk-noha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-ovs_dpdk-noha-virtual-fraser-trigger'
     triggers:
       - timed: '0 12 2-30/2 * *'
 - trigger:
-    name: 'compass-os-nosdn-bar-noha-virtual-euphrates-trigger'
+    name: 'compass-os-nosdn-bar-noha-virtual-fraser-trigger'
     triggers:
       - timed: '0 12 1-29/2 * *'
 - trigger:
-    name: 'compass-k8-nosdn-stor4nfv-noha-virtual-euphrates-trigger'
+    name: 'compass-k8-nosdn-stor4nfv-noha-virtual-fraser-trigger'
     triggers:
-      - timed: ''  # '0 12 2-30/2 * *'
+      - timed: '0 13 2-30/2 * *'
index 03bbb65..1ab50ae 100644 (file)
 
     properties:
       - logrotate-default
+      - throttle:
+          enabled: true
+          max-per-node: 1
+          option: 'project'
+      - build-blocker:
+          use-build-blocker: true
+          blocking-jobs:
+            - 'clover-daily-deploy-.*?'
+            - 'container4nfv-daily-deploy-.*?'
+          block-level: 'NODE'
 
     wrappers:
+      - timeout:
+          timeout: 240
+          abort: true
       - fix-workspace-permissions
 
     parameters:
index 03c6873..9b8b271 100644 (file)
           name: CI_DEBUG
           default: 'false'
           description: "Show debut output information"
+      - string:
+          name: GIT_BASE
+          default: https://gerrit.opnfv.org/gerrit/$PROJECT
+          description: "Used for overriding the GIT URL coming from Global Jenkins configuration."
 
     scm:
       - git-scm
index 453451f..2eb27a6 100644 (file)
@@ -20,8 +20,8 @@
       branch: '{stream}'
       disabled: false
       gs-pathname: ''
-    euphrates: &euphrates
-      stream: euphrates
+    fraser: &fraser
+      stream: fraser
       branch: 'stable/{stream}'
       gs-pathname: '/{stream}'
       disabled: false
     # -------------------------------
     # POD, INSTALLER, AND BRANCH MAPPING
     # -------------------------------
-    #        CI PODs
-    # -------------------------------
     pod:
+      # -------------------------------
+      #        CI PODs
+      # -------------------------------
       - baremetal:
           slave-label: daisy-baremetal
           <<: *master
       - virtual:
           slave-label: daisy-virtual
           <<: *master
-      - baremetal:
-          slave-label: daisy-baremetal
-      #     <<: *euphrates
-      - virtual:
-          slave-label: daisy-virtual
-      #     <<: *euphrates
+      - baremetal:
+          slave-label: daisy-baremetal
+          <<: *fraser
+      - virtual:
+          slave-label: daisy-virtual
+          <<: *fraser
       # -------------------------------
       #        None-CI PODs
       # -------------------------------
@@ -53,9 +54,9 @@
       - zte-pod9:
           slave-label: zte-pod9
           <<: *master
-    # -------------------------------
-    #        None-CI PODs
-    # -------------------------------
+      - zte-pod9:
+          slave-label: zte-pod9
+          <<: *fraser
 
     # -------------------------------
     #       scenarios
           use-build-blocker: true
           blocking-jobs:
             - 'daisy-kolla-build-.*'
-            - '{installer}-daily-(build|deploy|test)-(euphrates|master)'
-            - '{installer}-.*-(baremetal|virtual|zte-pod9)-daily-(euphrates|master)'
-            - '(functest|yardstick)-{installer}-(baremetal|virtual|zte-pod9)-daily-(euphrates|master)'
+            - '{installer}-(build|deploy|test)-daily-(fraser|master)'
+            - '{installer}-deploy-(baremetal|virtual|zte-pod9)-daily-(fraser|master)'
+            - '(functest|yardstick)-{installer}-(baremetal|virtual|zte-pod9)-daily-(fraser|master)'
           block-level: 'NODE'
 
     parameters:
       - timed: ''
 
 # ----------------------------------------------
-# Triggers for job running on daisy-baremetal against euphrates branch
+# Triggers for job running on daisy-baremetal against fraser branch
 # ----------------------------------------------
 # Basic HA Scenarios
 - trigger:
-    name: 'daisy-os-nosdn-nofeature-ha-baremetal-daily-euphrates-trigger'
+    name: 'daisy-os-nosdn-nofeature-ha-baremetal-daily-fraser-trigger'
     triggers:
       - timed: '0 0 * * *'
 # Basic NOHA Scenarios
 - trigger:
-    name: 'daisy-os-nosdn-nofeature-noha-baremetal-daily-euphrates-trigger'
+    name: 'daisy-os-nosdn-nofeature-noha-baremetal-daily-fraser-trigger'
     triggers:
       - timed: ''
 # ODL Scenarios
 - trigger:
-    name: 'daisy-os-odl-nofeature-ha-baremetal-daily-euphrates-trigger'
+    name: 'daisy-os-odl-nofeature-ha-baremetal-daily-fraser-trigger'
     triggers:
       - timed: '0 20 * * *'
 # ovs_dpdk Scenarios
 - trigger:
-    name: 'daisy-os-nosdn-ovs_dpdk-noha-baremetal-daily-euphrates-trigger'
+    name: 'daisy-os-nosdn-ovs_dpdk-noha-baremetal-daily-fraser-trigger'
     triggers:
       - timed: ''
 
 # ----------------------------------------------
-# Triggers for job running on daisy-virtual against euphrates branch
+# Triggers for job running on daisy-virtual against fraser branch
 # ----------------------------------------------
 # Basic HA Scenarios
 - trigger:
-    name: 'daisy-os-nosdn-nofeature-ha-virtual-daily-euphrates-trigger'
+    name: 'daisy-os-nosdn-nofeature-ha-virtual-daily-fraser-trigger'
     triggers:
       - timed: '0 0 * * *'
 # Basic NOHA Scenarios
 - trigger:
-    name: 'daisy-os-nosdn-nofeature-noha-virtual-daily-euphrates-trigger'
+    name: 'daisy-os-nosdn-nofeature-noha-virtual-daily-fraser-trigger'
     triggers:
       - timed: ''
 # ODL Scenarios
 - trigger:
-    name: 'daisy-os-odl-nofeature-ha-virtual-daily-euphrates-trigger'
+    name: 'daisy-os-odl-nofeature-ha-virtual-daily-fraser-trigger'
     triggers:
       - timed: '0 20 * * *'
 # ovs_dpdk Scenarios
 - trigger:
-    name: 'daisy-os-nosdn-ovs_dpdk-noha-virtual-daily-euphrates-trigger'
+    name: 'daisy-os-nosdn-ovs_dpdk-noha-virtual-daily-fraser-trigger'
     triggers:
       - timed: ''
 
 - trigger:
     name: 'daisy-os-nosdn-ovs_dpdk-noha-zte-pod9-daily-master-trigger'
     triggers:
-      - timed: '0 10,20 * * *'
+      - timed: '0 20 * * *'
 # Basic HA Scenarios
 - trigger:
     name: 'daisy-os-nosdn-nofeature-ha-zte-pod9-daily-master-trigger'
     name: 'daisy-os-odl-nofeature-ha-zte-pod9-daily-master-trigger'
     triggers:
       - timed: ''
+
+# ----------------------------------------------
+# ZTE POD9 Triggers running against fraser branch
+# ----------------------------------------------
+# ovs_dpdk Scenarios
+- trigger:
+    name: 'daisy-os-nosdn-ovs_dpdk-noha-zte-pod9-daily-fraser-trigger'
+    triggers:
+      - timed: '0 10 * * *'
+# Basic HA Scenarios
+- trigger:
+    name: 'daisy-os-nosdn-nofeature-ha-zte-pod9-daily-fraser-trigger'
+    triggers:
+      - timed: ''
+# Basic NOHA Scenarios
+- trigger:
+    name: 'daisy-os-nosdn-nofeature-noha-zte-pod9-daily-fraser-trigger'
+    triggers:
+      - timed: ''
+# ODL Scenarios
+- trigger:
+    name: 'daisy-os-odl-nofeature-ha-zte-pod9-daily-fraser-trigger'
+    triggers:
+      - timed: ''
index c4edd77..3ea74a9 100644 (file)
@@ -21,7 +21,7 @@
           branch: '{stream}'
           gs-pathname: ''
           disabled: false
-      - euphrates:
+      - fraser:
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
           disabled: false
@@ -94,7 +94,7 @@
       - email-jenkins-admins-on-failure
 
 - trigger:
-    name: 'daisy-kolla-build-euphrates-trigger'
+    name: 'daisy-kolla-build-fraser-trigger'
     triggers:
       - timed: '0 0 * * 0'
 
       - build-blocker:
           use-build-blocker: true
           blocking-jobs:
-            - '{installer}-daily-(build|deploy|test)-(euphrates|master)'
-            - '{installer}-.*-(baremetal|virtual|zte-pod9)-daily-(euphrates|master)'
-            - '(functest|yardstick)-{installer}-(baremetal|virtual|zte-pod9)-daily-(euphrates|master)'
+            - '{installer}-daily-(build|deploy|test)-(fraser|master)'
+            - '{installer}-.*-(baremetal|virtual|zte-pod9)-daily-(fraser|master)'
+            - '(functest|yardstick)-{installer}-(baremetal|virtual|zte-pod9)-daily-(fraser|master)'
           block-level: 'NODE'
 
     scm:
index f304d0b..3a0a59f 100644 (file)
@@ -19,7 +19,7 @@
           branch: '{stream}'
           gs-pathname: ''
           disabled: false
-      - euphrates:
+      - fraser:
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
           disabled: false
@@ -60,7 +60,7 @@
       - build-blocker:
           use-build-blocker: true
           blocking-jobs:
-            - '{alias}-merge-(master|euphrates)'
+            - '{alias}-merge-(master|fraser)'
           block-level: 'NODE'
 
     scm:
index 4100990..777b677 100644 (file)
@@ -16,7 +16,7 @@
           branch: '{stream}'
           gs-pathname: ''
           disabled: false
-      - euphrates:
+      - fraser:
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
           disabled: false
index a5a95f4..d011283 100755 (executable)
@@ -93,13 +93,24 @@ fi
 cat $OPENRC
 
 if [[ ! "${SUT_BRANCH}" =~ "danube" && ${INSTALLER_TYPE} == "compass" ]]; then
+    compass_repo=${WORKSPACE}/compass4nfv/
+    git clone https://github.com/opnfv/compass4nfv.git ${compass_repo} >/dev/null
+    sudo pip install shyaml
+    scenario_file=${compass_repo}/deploy/conf/hardware_environment/$NODE_NAME/os-nosdn-nofeature-ha.yml
+    ipmiIp=$(cat ${scenario_file} | shyaml get-value hosts.0.ipmiIp)
+    ipmiPass=$(cat ${scenario_file} | shyaml get-value hosts.0.ipmiPass)
+    ipmiUser=root
+    jumpserver_ip=$(ifconfig | grep -A 5 docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1)
+
     cat << EOF >${DOVETAIL_CONFIG}/pod.yaml
 nodes:
-- {ip: 10.1.0.52, name: node1, password: root, role: controller, user: root}
+- {ip: ${jumpserver_ip}, name: node0, password: root, role: Jumpserver, user: root}
+- {ip: 10.1.0.50, name: node1, password: root, role: controller, user: root,
+   ipmi_ip: ${ipmiIp}, ipmi_user: ${ipmiUser}, ipmi_password: ${ipmiPass}}
 - {ip: 10.1.0.51, name: node2, password: root, role: controller, user: root}
-- {ip: 10.1.0.50, name: node3, password: root, role: controller, user: root}
-- {ip: 10.1.0.54, name: node4, password: root, role: compute, user: root}
-- {ip: 10.1.0.53, name: node5, password: root, role: compute, user: root}
+- {ip: 10.1.0.52, name: node3, password: root, role: controller, user: root}
+- {ip: 10.1.0.53, name: node4, password: root, role: compute, user: root}
+- {ip: 10.1.0.54, name: node5, password: root, role: compute, user: root}
 
 EOF
 fi
@@ -154,6 +165,14 @@ if [[ ! -f ${DOVETAIL_CONFIG}/pod.yaml ]]; then
 fi
 
 if [ -f ${DOVETAIL_CONFIG}/pod.yaml ]; then
+    sudo chmod 666 ${DOVETAIL_CONFIG}/pod.yaml
+    echo "Adapt process info for $INSTALLER_TYPE ..."
+    attack_process='rabbitmq'
+    cat << EOF >> ${DOVETAIL_CONFIG}/pod.yaml
+process_info:
+- {testcase_name: dovetail.ha.tc010, attack_process: ${attack_process}}
+
+EOF
     echo "file ${DOVETAIL_CONFIG}/pod.yaml:"
     cat ${DOVETAIL_CONFIG}/pod.yaml
 else
@@ -300,8 +319,9 @@ sudo cp -r ${DOVETAIL_HOME}/results ./
 # PRIMARY_GROUP=$(id -gn $CURRENT_USER)
 # sudo chown -R ${CURRENT_USER}:${PRIMARY_GROUP} ${WORKSPACE}/results
 
-#remove useless workspace from yardstick to save disk space
+#remove useless files to save disk space
 sudo rm -rf ./results/workspace
+sudo rm -f ./results/yardstick.img
 
 echo "Dovetail: done!"
 
index 432bbbb..dfadf9a 100755 (executable)
@@ -161,28 +161,35 @@ if [ "${INSTALLER_TYPE}" == 'fuel' ]; then
     envs="${envs} -e POD_ARCH=${COMPUTE_ARCH}"
 fi
 
-volumes="${images_vol} ${results_vol} ${sshkey_vol} ${rc_file_vol} ${cacert_file_vol}"
 
-set +e
+if [[ ${INSTALLER_TYPE} == 'compass' && ${DEPLOY_SCENARIO} =~ 'sfc' ]]; then
+    ssh_key="/tmp/id_rsa"
+    user_config="/tmp/openstack_user_config.yml"
+    docker cp compass-tasks:/root/.ssh/id_rsa $ssh_key
+    docker cp compass-tasks:/etc/openstack_deploy/openstack_user_config.yml $user_config
+    sshkey_vol="-v ${ssh_key}:/root/.ssh/id_rsa"
+    userconfig_vol="-v ${user_config}:${user_config}"
+    envs="${envs} -e EXTERNAL_NETWORK=${EXTERNAL_NETWORK}"
+fi
+
+
+volumes="${images_vol} ${results_vol} ${sshkey_vol} ${userconfig_vol} ${rc_file_vol} ${cacert_file_vol}"
 
+set +e
 
-if [[ ${DEPLOY_SCENARIO} =~ ^os-.* ]]; then
-    [[ ${BRANCH##*/} == "master" ]] && check_os_deployment
-    if [ ${FUNCTEST_MODE} == 'testcase' ]; then
-        echo "FUNCTEST_MODE=testcase, FUNCTEST_SUITE_NAME=${FUNCTEST_SUITE_NAME}"
-        run_test ${FUNCTEST_SUITE_NAME}
-    elif [ ${FUNCTEST_MODE} == 'tier' ]; then
-        echo "FUNCTEST_MODE=tier, FUNCTEST_TIER=${FUNCTEST_TIER}"
-        tiers=(${FUNCTEST_TIER})
-        run_tiers ${tiers}
+[[ ${BRANCH##*/} == "master" ]] && check_os_deployment
+if [ ${FUNCTEST_MODE} == 'testcase' ]; then
+    echo "FUNCTEST_MODE=testcase, FUNCTEST_SUITE_NAME=${FUNCTEST_SUITE_NAME}"
+    run_test ${FUNCTEST_SUITE_NAME}
+elif [ ${FUNCTEST_MODE} == 'tier' ]; then
+    echo "FUNCTEST_MODE=tier, FUNCTEST_TIER=${FUNCTEST_TIER}"
+    tiers=(${FUNCTEST_TIER})
+    run_tiers ${tiers}
+else
+    if [ ${DEPLOY_TYPE} == 'baremetal' ]; then
+        tiers=(healthcheck smoke features vnf parser)
     else
-        if [ ${DEPLOY_TYPE} == 'baremetal' ]; then
-            tiers=(healthcheck smoke features vnf parser)
-        else
-            tiers=(healthcheck smoke features)
-        fi
-        run_tiers ${tiers}
+        tiers=(healthcheck smoke features)
     fi
-else
-    echo "k8 deployment has not been supported by functest yet"
+    run_tiers ${tiers}
 fi
index a58e0bf..8ffbe9e 100644 (file)
       - 'daily':
           job-timeout: 360
       - 'arm-daily':
-          job-timeout: 360
+          job-timeout: 480
 
     jobs:
       - 'functest-{installer}-{pod}-{testsuite}-{stream}'
index 909c7b0..43fb4f0 100644 (file)
@@ -12,6 +12,9 @@
       - master:
           branch: '{stream}'
           disabled: false
+      - fraser:
+          branch: 'stable/{stream}'
+          disabled: false
       - euphrates:
           branch: 'stable/{stream}'
           disabled: false
index b7d33e7..323b325 100755 (executable)
@@ -45,5 +45,11 @@ elif [[ ${INSTALLER_TYPE} == 'daisy' ]]; then
         echo "No available installer VM exists...exiting"
         exit 1
     fi
+
+elif [[ ${INSTALLER_TYPE} == 'fuel' ]]; then
+    if [[ ! "${BRANCH}" =~ "danube" ]]; then
+        echo "Map mcp ssh_key"
+        export sshkey_vol="-v ${SSH_KEY:-/var/lib/opnfv/mcp.rsa}:/root/.ssh/id_rsa"
+    fi
 fi
 
index 3f08e4a..9017354 100755 (executable)
@@ -12,14 +12,13 @@ sudo rm -rf $rc_file
 
 if [[ ${INSTALLER_TYPE} == 'compass' ]]; then
     admin_conf_file_vol="-v ${HOME}/admin.conf:/root/.kube/config"
-    echo "export KUBECONFIG=/root/.kube/config" >> $rc_file
     echo "export KUBERNETES_PROVIDER=local" >> $rc_file
     KUBE_MASTER_URL=$(cat ${HOME}/admin.conf|grep server| awk '{print $2}')
     echo "export KUBE_MASTER_URL=$KUBE_MASTER_URL" >> $rc_file
     KUBE_MASTER_IP=$(echo $KUBE_MASTER_URL|awk -F'https://|:[0-9]+' '$0=$2')
     echo "export KUBE_MASTER_IP=$KUBE_MASTER_IP" >> $rc_file
 elif [[ ${INSTALLER_TYPE} == 'joid' && ${BRANCH} == 'master' ]]; then
-    admin_conf_file_vol="-v ${HOME}/joid_config/config:/root/joid_config/config"
+    admin_conf_file_vol="-v ${HOME}/joid_config/config:/root/.kube/config"
     rc_file=${HOME}/joid_config/k8config
 else
     echo "Not supported by other installers yet"
@@ -35,25 +34,25 @@ results_vol="-v ${dir_result}:${FUNCTEST_DIR}/results"
 
 volumes="${rc_file_vol} ${results_vol} ${admin_conf_file_vol}"
 
-# Set iptables rule to allow forwarding return traffic for container
-if ! sudo iptables -C FORWARD -j RETURN 2> ${redirect} || ! sudo iptables -L FORWARD | awk 'NR==3' | grep RETURN 2> ${redirect}; then
-    sudo iptables -I FORWARD -j RETURN
-fi
-
 envs="-e INSTALLER_TYPE=${INSTALLER_TYPE} \
     -e NODE_NAME=${NODE_NAME} -e DEPLOY_SCENARIO=${DEPLOY_SCENARIO} \
     -e BUILD_TAG=${BUILD_TAG} -e DEPLOY_TYPE=${DEPLOY_TYPE}"
 
 DOCKER_TAG=`[[ ${BRANCH##*/} == "master" ]] && echo "latest" || echo ${BRANCH##*/}`
 
+set +e
+
 FUNCTEST_IMAGE=opnfv/functest-kubernetes:${DOCKER_TAG}
 echo "Pulling Docker image ${FUNCTEST_IMAGE} ..."
 docker pull ${FUNCTEST_IMAGE}>/dev/null
 cmd_opt="run_tests -r -t all"
-cmd="docker run --rm --privileged=true ${envs} ${volumes} ${FUNCTEST_IMAGE} /bin/bash -c '${cmd_opt}'"
+cmd="docker run --rm ${envs} ${volumes} ${FUNCTEST_IMAGE} /bin/bash -c '${cmd_opt}'"
 echo "Running Functest k8s test cases, CMD: ${cmd}"
 eval ${cmd}
 ret_value=$?
+
+ret_val_file="${HOME}/opnfv/functest/results/${BRANCH##*/}/return_value"
+echo 0 > ${ret_val_file}
 if [ ${ret_value} != 0 ]; then
   echo ${ret_value} > ${ret_val_file}
 fi
index 3eba5d1..5599906 100644 (file)
           branch: '{stream}'
           gs-pathname: ''
           disabled: false
+      - fraser:
+          branch: 'stable/{stream}'
+          gs-pathname: '/{stream}'
+          disabled: false
       - euphrates:
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
index e068a4f..b3ab3ca 100644 (file)
           branch: '{stream}'
           gs-pathname: ''
           disabled: false
+      - fraser:
+          branch: 'stable/{stream}'
+          gs-pathname: '/{stream}'
+          disabled: false
       - euphrates:
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
index e55f068..a8b9cff 100644 (file)
@@ -13,7 +13,7 @@
           branch: '{stream}'
           gs-pathname: ''
           disabled: false
-      - euphrates:
+      - fraser:
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
           disabled: false
index 6171a6a..628c13f 100644 (file)
           default: /root/.ssh/id_rsa
           description: 'SSH key to use for Apex'
 
+- parameter:
+    name: 'apex-baremetal-fraser-defaults'
+    parameters:
+      - label:
+          name: SLAVE_LABEL
+          default: 'apex-baremetal-master'
+      - string:
+          name: GIT_BASE
+          default: https://gerrit.opnfv.org/gerrit/$PROJECT
+          description: 'Git URL to use on this Jenkins Slave'
+      - string:
+          name: SSH_KEY
+          default: /root/.ssh/id_rsa
+          description: 'SSH key to use for Apex'
+
 - parameter:
     name: 'apex-baremetal-euphrates-defaults'
     parameters:
           default: /root/.ssh/id_rsa
           description: 'SSH key to use for Apex'
 
+- parameter:
+    name: 'apex-virtual-fraser-defaults'
+    parameters:
+      - label:
+          name: SLAVE_LABEL
+          default: 'apex-virtual-master'
+      - string:
+          name: GIT_BASE
+          default: https://gerrit.opnfv.org/gerrit/$PROJECT
+          description: 'Git URL to use on this Jenkins Slave'
+      - string:
+          name: SSH_KEY
+          default: /root/.ssh/id_rsa
+          description: 'SSH key to use for Apex'
+
 - parameter:
     name: 'apex-virtual-euphrates-defaults'
     parameters:
index 947b2f1..1e92fbf 100644 (file)
@@ -13,8 +13,8 @@
     # -------------------------------
     # BRANCH ANCHORS
     # -------------------------------
-    euphrates: &euphrates
-      stream: euphrates
+    fraser: &fraser
+      stream: fraser
       branch: 'stable/{stream}'
       disabled: false
       gs-pathname: '/{stream}'
@@ -31,7 +31,7 @@
     pod:
       - baremetal:
           slave-label: joid-baremetal
-          <<: *euphrates
+          <<: *fraser
       - baremetal:
           slave-label: joid-baremetal
           <<: *master
 ########################
 # trigger macros
 ########################
-# os-nosdn-nofeature-ha trigger - branch: euphrates
+# os-nosdn-nofeature-ha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-nosdn-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'joid-os-nosdn-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 2 * * *'
 # os-nosdn-nofeature-ha trigger - branch: master
     name: 'joid-os-nosdn-nofeature-ha-baremetal-master-trigger'
     triggers:
       - timed: '5 2 * * *'
-# os-odl_l2-nofeature-ha trigger - branch: euphrates
+# os-odl_l2-nofeature-ha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-odl_l2-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'joid-os-odl_l2-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 7 * * *'
 # os-odl_l2-nofeature-ha trigger - branch: master
     name: 'joid-os-odl_l2-nofeature-ha-baremetal-master-trigger'
     triggers:
       - timed: '5 7 * * *'
-# os-nosdn-lxd-noha trigger - branch: euphrates
+# os-nosdn-lxd-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-nosdn-lxd-noha-baremetal-euphrates-trigger'
+    name: 'joid-os-nosdn-lxd-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 22 * * *'
 # os-nosdn-lxd-noha trigger - branch: master
     name: 'joid-os-nosdn-lxd-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 22 * * *'
-# os-nosdn-lxd-ha trigger - branch: euphrates
+# os-nosdn-lxd-ha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-nosdn-lxd-ha-baremetal-euphrates-trigger'
+    name: 'joid-os-nosdn-lxd-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 10 * * *'
 # os-nosdn-lxd-ha trigger - branch: master
     name: 'joid-os-nosdn-lxd-ha-baremetal-master-trigger'
     triggers:
       - timed: '5 10 * * *'
-# os-nosdn-nofeature-noha trigger - branch: euphrates
+# os-nosdn-nofeature-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-nosdn-nofeature-noha-baremetal-euphrates-trigger'
+    name: 'joid-os-nosdn-nofeature-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 4 * * *'
 # os-nosdn-nofeature-noha trigger - branch: master
     name: 'joid-os-nosdn-nofeature-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 4 * * *'
-# k8-nosdn-nofeature-noha trigger - branch: euphrates
+# k8-nosdn-nofeature-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-k8-nosdn-nofeature-noha-baremetal-euphrates-trigger'
+    name: 'joid-k8-nosdn-nofeature-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 15 * * *'
 # k8-nosdn-nofeature-noha trigger - branch: master
     name: 'joid-k8-nosdn-nofeature-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 15 * * *'
-# k8-nosdn-lb-noha trigger - branch: euphrates
+# k8-nosdn-lb-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-k8-nosdn-lb-noha-baremetal-euphrates-trigger'
+    name: 'joid-k8-nosdn-lb-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 20 * * *'
 # k8-nosdn-lb-noha trigger - branch: master
     name: 'joid-k8-nosdn-lb-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 20 * * *'
-# k8-ovn-lb-noha trigger - branch: euphrates
+# k8-ovn-lb-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-k8-ovn-lb-noha-baremetal-euphrates-trigger'
+    name: 'joid-k8-ovn-lb-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 17 * * *'
 # k8-ovn-lb-noha trigger - branch: master
     name: 'joid-k8-ovn-lb-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 17 * * *'
-# os-nosdn-openbaton-ha trigger - branch: euphrates
+# os-nosdn-openbaton-ha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-nosdn-openbaton-ha-baremetal-euphrates-trigger'
+    name: 'joid-os-nosdn-openbaton-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 23 * * *'
 # os-nosdn-openbaton-ha trigger - branch: master
     name: 'joid-os-nosdn-openbaton-ha-baremetal-master-trigger'
     triggers:
       - timed: '5 23 * * *'
-# os-ocl-nofeature-ha trigger - branch: euphrates
+# os-ocl-nofeature-ha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-ocl-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'joid-os-ocl-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 13 * * *'
 # os-ocl-nofeature-ha trigger - branch: master
     name: 'joid-os-ocl-nofeature-ha-baremetal-master-trigger'
     triggers:
       - timed: '5 13 * * *'
-# os-ocl-nofeature-noha trigger - branch: euphrates
+# os-ocl-nofeature-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-ocl-nofeature-noha-baremetal-euphrates-trigger'
+    name: 'joid-os-ocl-nofeature-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 16 * * *'
 # os-ocl-nofeature-noha trigger - branch: master
     name: 'joid-os-ocl-nofeature-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 16 * * *'
-# k8-canal-lb-noha trigger - branch: euphrates
+# k8-canal-lb-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-k8-canal-lb-noha-baremetal-euphrates-trigger'
+    name: 'joid-k8-canal-lb-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 14 * * *'
 # k8-canal-lb-noha trigger - branch: master
     name: 'joid-k8-canal-lb-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 14 * * *'
-# k8-multus-lb-noha trigger - branch: euphrates
+# k8-multus-lb-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-k8-multus-lb-noha-baremetal-euphrates-trigger'
+    name: 'joid-k8-multus-lb-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 18 * * *'
 # k8-multus-lb-noha trigger - branch: master
     name: 'joid-k8-multus-lb-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 18 * * *'
-# k8-nosdn-lb_ceph-noha trigger - branch: euphrates
+# k8-nosdn-lb_ceph-noha trigger - branch: fraser
 - trigger:
-    name: 'joid-k8-nosdn-lb_ceph-noha-baremetal-euphrates-trigger'
+    name: 'joid-k8-nosdn-lb_ceph-noha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 18 * * *'
 # k8-nosdn-lb_ceph-noha trigger - branch: master
     name: 'joid-k8-nosdn-lb_ceph-noha-baremetal-master-trigger'
     triggers:
       - timed: '5 18 * * *'
-# os-ovn-nofeature-ha trigger - branch: euphrates
+# os-ovn-nofeature-ha trigger - branch: fraser
 - trigger:
-    name: 'joid-os-ovn-nofeature-ha-baremetal-euphrates-trigger'
+    name: 'joid-os-ovn-nofeature-ha-baremetal-fraser-trigger'
     triggers:
       - timed: '5 19 * * *'
 # os-ovn-nofeature-ha trigger - branch: master
index 53bc3f3..2d1c7c9 100644 (file)
@@ -13,7 +13,7 @@
           branch: '{stream}'
           gs-pathname: ''
           disabled: false
-      - euphrates:
+      - fraser: &fraser
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
           disabled: false
index 0722b40..5982697 100644 (file)
@@ -2,6 +2,7 @@ apex
 armband
 availability
 bottlenecks
+clover
 compass4nfv
 copper
 conductor
index 5c0bb88..b0822cf 100644 (file)
           pod: zte-virtual5
           sut: ''
           <<: *master
+      - network:
+          installer: apex
+          pod: zte-virtual5
+          sut: ''
+          <<: *master
       - compute:
           installer: fuel
           pod: zte-virtual6
           sut: vnf
           <<: *master
 
+
     # -------------------------------
     # JOB LIST
     # -------------------------------
@@ -88,7 +94,7 @@
 
     wrappers:
       - timeout:
-          timeout: 30
+          timeout: 120
           abort: true
       - timestamps
 
index 0ac5520..80893de 100644 (file)
     jobs:
       - 'opnfv-lint-verify-{stream}'
       - 'opnfv-yamllint-verify-{stream}'
+      - 'opnfv-pylint-verify-{stream}'
 
     stream:
       - master:
           branch: '{stream}'
           gs-pathname: ''
           disabled: false
+      - fraser:
+          branch: 'stable/{stream}'
+          gs-pathname: '/{stream}'
+          disabled: false
       - danube:
           branch: 'stable/{stream}'
           gs-pathname: '/{stream}'
diff --git a/jjb/releng/releng-release-create-branch.sh b/jjb/releng/releng-release-create-branch.sh
new file mode 100644 (file)
index 0000000..92be0e6
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/bash
+# SPDX-License-Identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018 The Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+set -xe
+
+# Configure the git user/email as we'll be pushing up changes
+git config --global user.name "jenkins-ci"
+git config --global user.email "jenkins-opnfv-ci@opnfv.org"
+
+# Ensure we are able to generate Commit-IDs for new patchsets
+curl -kLo .git/hooks/commit-msg https://gerrit.opnfv.org/gerrit/tools/hooks/commit-msg
+chmod +x .git/hooks/commit-msg
+
+# Activate virtualenv, supressing shellcheck warning
+# shellcheck source=/dev/null
+. $WORKSPACE/venv/bin/activate
+pip install -r releases/scripts/requirements.txt
+
+STREAM=${STREAM:-'nostream'}
+RELEASE_FILES=$(git diff HEAD^1 --name-only -- "releases/$STREAM")
+
+for release_file in $RELEASE_FILES; do
+    python releases/scripts/create_branch.py -f $release_file
+    python releases/scripts/create_jobs.py -f $release_file
+    NEW_FILES=$(git status --porcelain --untracked=no | cut -c4-)
+    if [ -n "$NEW_FILES" ]; then
+      git add $NEW_FILES
+      git commit -sm "Create Stable Branch Jobs for $(basename $release_file .yaml)"
+      git push origin HEAD:refs/for/master
+    fi
+done
diff --git a/jjb/releng/releng-release-jobs.yml b/jjb/releng/releng-release-jobs.yml
new file mode 100644 (file)
index 0000000..e31320b
--- /dev/null
@@ -0,0 +1,119 @@
+# SPDX-License-Identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018 The Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+---
+- project:
+    name: releng-release-jobs
+
+    stream:
+      - fraser
+
+    jobs:
+      - 'releng-release-{stream}-verify'
+      - 'releng-release-{stream}-merge'
+
+    project: 'releng'
+
+- job-template:
+    name: 'releng-release-{stream}-verify'
+
+    parameters:
+      - stream-parameter:
+          stream: '{stream}'
+      - project-parameter:
+          project: '{project}'
+          branch: 'master'
+
+    scm:
+      - git-scm-gerrit
+
+    triggers:
+      - gerrit:
+          server-name: 'gerrit.opnfv.org'
+          trigger-on:
+            - patchset-created-event:
+                exclude-drafts: 'false'
+                exclude-trivial-rebase: 'false'
+                exclude-no-code-change: 'false'
+            - comment-added-contains-event:
+                comment-contains-value: 'recheck'
+            - comment-added-contains-event:
+                comment-contains-value: 'reverify'
+          projects:
+            - project-compare-type: 'ANT'
+              project-pattern: 'releng'
+              branches:
+                - branch-compare-type: 'ANT'
+                  branch-pattern: '**/master'
+              file-paths:
+                - compare-type: ANT
+                  pattern: 'releases/{stream}/**'
+                - compare-type: ANT
+                  pattern: 'releases/schema.yaml'
+                - compare-type: ANT
+                  pattern: 'releases/scripts/verify_schema.py'
+
+    builders:
+      - create-virtualenv
+      - shell:
+          !include-raw-escape: releng-release-verify.sh
+
+    publishers:
+      - email-jenkins-admins-on-failure
+
+- job-template:
+    name: 'releng-release-{stream}-merge'
+
+    parameters:
+      - node:
+          name: SLAVE_NAME
+          description: 'Only run merge job on build1'
+          default-slaves:
+            - lf-build1
+          allowed-multiselect: false
+          ignore-offline-nodes: true
+      - stream-parameter:
+          stream: '{stream}'
+      - project-parameter:
+          project: '{project}'
+          branch: 'master'
+
+    scm:
+      - git-scm-gerrit
+
+    triggers:
+      - gerrit-trigger-change-merged:
+          project: '{project}'
+          branch: 'master'
+          files: 'releases/{stream}/*'
+
+    builders:
+      - create-virtualenv
+      - shell:
+          !include-raw-escape: releng-release-create-branch.sh
+
+    publishers:
+      - email-jenkins-admins-on-failure
+
+- parameter:
+    name: stream-parameter
+    parameters:
+      - string:
+          name: STREAM
+          default: '{stream}'
+          description: "OPNFV Stable Stream"
+
+- builder:
+    name: create-virtualenv
+    builders:
+      - shell: |
+          #!/bin/bash
+          sudo pip install virtualenv
+          virtualenv $WORKSPACE/venv
+          . $WORKSPACE/venv/bin/activate
+          pip install --upgrade pip
diff --git a/jjb/releng/releng-release-verify.sh b/jjb/releng/releng-release-verify.sh
new file mode 100644 (file)
index 0000000..c1262e2
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/bash
+# SPDX-License-Identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018 The Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+set -xe
+
+# Activate virtualenv, supressing shellcheck warning
+# shellcheck source=/dev/null
+. $WORKSPACE/venv/bin/activate
+pip install -r releases/scripts/requirements.txt
+
+STREAM=${STREAM:-'nostream'}
+RELEASE_FILES=$(git diff HEAD^1 --name-only -- "releases/$STREAM")
+
+# TODO: The create_branch.py should be refactored so it can be used here
+# to verify the commit exists that is being added, along with
+# jjb/<project>
+for release_file in $RELEASE_FILES; do
+    python releases/scripts/verify_schema.py \
+    -s releases/schema.yaml \
+    -y $release_file
+done
index 9219d00..9d524bc 100755 (executable)
@@ -17,7 +17,7 @@ cd $WORKSPACE
 git fetch $PROJECT_REPO $GERRIT_REFSPEC && sudo git checkout FETCH_HEAD
 
 # combine opnfv and upstream scripts/playbooks
-/bin/cp -rf $WORKSPACE/releng-xci/bifrost/* $WORKSPACE/
+/bin/cp -rf $WORKSPACE/releng-xci/xci/infra/bifrost/* $WORKSPACE/
 
 cd $WORKSPACE/releng-xci
 cat > bifrost_test.sh<<EOF
index 8a3a7cf..e4e5705 100644 (file)
@@ -9,27 +9,23 @@
     stream:
       - master:
           branch: '{stream}'
+          disabled: false
     # -------------------------------
     # distros
     # -------------------------------
     distro:
       - ubuntu:
           disabled: false
+          kill-phase-on: FAILURE
+          abort-all-job: true
       - centos:
-          disabled: false
+          disabled: true
+          kill-phase-on: NEVER
+          abort-all-job: false
       - opensuse:
           disabled: false
-    # -------------------------------
-    # scenarios
-    # -------------------------------
-    scenario:
-      - 'os-odl-sfc':
-          project: sfc
-    # -------------------------------
-    # type
-    # -------------------------------
-    type:
-      - virtual
+          kill-phase-on: FAILURE
+          abort-all-job: true
     # -------------------------------
     # postmerge promotion phases
     # -------------------------------
     # jobs
     # -------------------------------
     jobs:
-      - 'xci-{scenario}-{type}-merge-{stream}'
-      - 'xci-{scenario}-{type}-promote-merge-{stream}'
-      - 'xci-merge-{distro}-{type}-{stream}'
-      - 'xci-merge-{distro}-{phase}-{type}-{stream}'
+      - 'xci-merge-virtual-{stream}'
+      - 'xci-merge-promote-virtual-{stream}'
+      - 'xci-merge-{distro}-virtual-{stream}'
+      - 'xci-merge-{distro}-{phase}-virtual-{stream}'
 # -------------------------------
 # job templates
 # -------------------------------
 - job-template:
-    name: 'xci-{scenario}-{type}-merge-{stream}'
+    name: 'xci-merge-virtual-{stream}'
 
     project-type: multijob
 
                 comment-contains-value: 'remerge'
           projects:
             - project-compare-type: 'ANT'
-              project-pattern: '{obj:project}'
+              project-pattern: 'releng-xci'
+              branches:
+                - branch-compare-type: 'ANT'
+                  branch-pattern: '**/{branch}'
+              disable-strict-forbidden-file-verification: 'false'
+              forbidden-file-paths:
+                - compare-type: ANT
+                  pattern: 'xci/scripts/vm/**'
+                - compare-type: ANT
+                  pattern: 'docs/**'
+                - compare-type: ANT
+                  pattern: 'prototypes/**'
+                - compare-type: ANT
+                  pattern: 'upstream/**'
+                - compare-type: ANT
+                  pattern: 'INFO.yaml'
+            - project-compare-type: 'REG_EXP'
+              project-pattern: 'sfc|sdnvpn'
               branches:
                 - branch-compare-type: 'ANT'
                   branch-pattern: '**/{branch}'
       - label:
           name: SLAVE_LABEL
           default: 'xci-virtual'
+      - string:
+          name: CI_LOOP
+          default: 'merge'
+      - string:
+          name: FUNCTEST_MODE
+          default: 'tier'
+      - string:
+          name: FUNCTEST_SUITE_NAME
+          default: 'healthcheck'
       - string:
           name: DISTRO
           default: 'all'
           description: 'Git URL to use on this Jenkins Slave'
 
     builders:
-      - description-setter:
-          description: "Node: $NODE_NAME"
       - 'xci-merge-set-scenario-macro'
+      - inject:
+          properties-file: "/tmp/$GERRIT_CHANGE_NUMBER/$DISTRO/scenario.properties"
+      - description-setter:
+          description: "Scenario: $DEPLOY_SCENARIO | Node: $NODE_NAME"
       - multijob:
           name: deploy and test
           condition: SUCCESSFUL
           projects:
-            - name: 'xci-merge-opensuse-{type}-{stream}'
+            - name: 'xci-merge-opensuse-virtual-{stream}'
               current-parameters: false
               predefined-parameters: |
                 DISTRO=opensuse
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
                 GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
                 GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
+                CI_LOOP=$CI_LOOP
+                FUNCTEST_MODE=$FUNCTEST_MODE
+                FUNCTEST_SUITE_NAME=$FUNCTEST_SUITE_NAME
               node-parameters: false
               kill-phase-on: FAILURE
               abort-all-job: true
-            - name: 'xci-merge-ubuntu-{type}-{stream}'
+            - name: 'xci-merge-ubuntu-virtual-{stream}'
               current-parameters: false
               predefined-parameters: |
                 DISTRO=ubuntu
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
                 GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
                 GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
+                CI_LOOP=$CI_LOOP
+                FUNCTEST_MODE=$FUNCTEST_MODE
+                FUNCTEST_SUITE_NAME=$FUNCTEST_SUITE_NAME
               node-parameters: false
               kill-phase-on: FAILURE
               abort-all-job: true
-            - name: 'xci-merge-centos-{type}-{stream}'
+            - name: 'xci-merge-centos-virtual-{stream}'
               current-parameters: false
               predefined-parameters: |
                 DISTRO=centos
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
                 GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
                 GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
+                CI_LOOP=$CI_LOOP
+                FUNCTEST_MODE=$FUNCTEST_MODE
+                FUNCTEST_SUITE_NAME=$FUNCTEST_SUITE_NAME
               node-parameters: false
-              kill-phase-on: FAILURE
-              abort-all-job: true
+              kill-phase-on: NEVER
+              abort-all-job: false
       - inject:
           properties-file: "/tmp/$GERRIT_CHANGE_NUMBER/$DISTRO/scenario.properties"
       - multijob:
           name: promote
           condition: SUCCESSFUL
           projects:
-            - name: 'xci-{scenario}-{type}-promote-merge-{stream}'
+            - name: 'xci-merge-promote-virtual-{stream}'
               current-parameters: true
               predefined-parameters: |
                 GERRIT_PROJECT=$GERRIT_PROJECT
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
                 GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
                 GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
+                CI_LOOP=$CI_LOOP
+                FUNCTEST_MODE=$FUNCTEST_MODE
+                FUNCTEST_SUITE_NAME=$FUNCTEST_SUITE_NAME
               node-parameters: true
               kill-phase-on: NEVER
               abort-all-job: true
 
 - job-template:
-    name: 'xci-merge-{distro}-{type}-{stream}'
+    name: 'xci-merge-{distro}-virtual-{stream}'
 
     project-type: multijob
 
     disabled: '{obj:disabled}'
 
-    concurrent: true
+    concurrent: false
 
     properties:
       - logrotate-default
       - label:
           name: SLAVE_LABEL
           default: 'xci-virtual'
+      - string:
+          name: CI_LOOP
+          default: 'merge'
+      - string:
+          name: FUNCTEST_MODE
+          default: 'tier'
+      - string:
+          name: FUNCTEST_SUITE_NAME
+          default: 'healthcheck'
       - string:
           name: DISTRO
           default: '{distro}'
           name: deploy
           condition: SUCCESSFUL
           projects:
-            - name: 'xci-merge-{distro}-deploy-{type}-{stream}'
+            - name: 'xci-merge-{distro}-deploy-virtual-{stream}'
               current-parameters: true
               predefined-parameters: |
                 DISTRO={distro}
                 GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
                 GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
               node-parameters: true
-              kill-phase-on: FAILURE
-              abort-all-job: true
+              kill-phase-on: '{kill-phase-on}'
+              abort-all-job: '{abort-all-job}'
       - multijob:
           name: healthcheck
           condition: SUCCESSFUL
           projects:
-            - name: 'xci-merge-{distro}-healthcheck-{type}-{stream}'
+            - name: 'xci-merge-{distro}-healthcheck-virtual-{stream}'
               current-parameters: true
               predefined-parameters: |
                 DISTRO={distro}
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
                 GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
                 GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
-                FUNCTEST_MODE=tier
-                FUNCTEST_TIER=healthcheck
+                CI_LOOP=$CI_LOOP
+                FUNCTEST_MODE=$FUNCTEST_MODE
+                FUNCTEST_SUITE_NAME=$FUNCTEST_SUITE_NAME
               node-parameters: true
-              kill-phase-on: NEVER
-              abort-all-job: true
+              kill-phase-on: '{kill-phase-on}'
+              abort-all-job: '{abort-all-job}'
 
     publishers:
       - postbuildscript:
                 !include-raw: ./xci-cleanup.sh
 
 - job-template:
-    name: 'xci-merge-{distro}-{phase}-{type}-{stream}'
+    name: 'xci-merge-{distro}-{phase}-virtual-{stream}'
 
     disabled: false
 
-    concurrent: true
+    concurrent: false
 
     properties:
       - logrotate-default
       - string:
           name: DISTRO
           default: 'ubuntu'
+      - string:
+          name: CI_LOOP
+          default: 'merge'
       - string:
           name: FUNCTEST_MODE
           default: 'tier'
       - 'xci-merge-{phase}-macro'
 
 - job-template:
-    name: 'xci-{scenario}-{type}-promote-merge-{stream}'
+    name: 'xci-merge-promote-virtual-{stream}'
 
     disabled: false
 
       - string:
           name: PROJECT
           default: $GERRIT_PROJECT
+      - string:
+          name: CI_LOOP
+          default: 'merge'
+      - string:
+          name: FUNCTEST_MODE
+          default: 'tier'
+      - string:
+          name: FUNCTEST_SUITE_NAME
+          default: 'healthcheck'
       - string:
           name: DISTRO
           default: 'all'
       - string:
           name: OPNFV_RELENG_DEV_PATH
           default: $WORKSPACE/
+      - string:
+          name: LOCAL_PROMOTION_METADATA_FILE
+          default: "/tmp/$GERRIT_CHANGE_NUMBER/$DISTRO/scenario.properties"
+      - string:
+          name: REMOTE_PROMOTION_METADATA_FILE
+          default: "gs://artifacts.opnfv.org/xci/pipeline/merge/$DEPLOY_SCENARIO.properties"
       - string:
           name: GIT_BASE
           default: https://gerrit.opnfv.org/gerrit/$PROJECT
 - builder:
     name: 'xci-merge-deploy-macro'
     builders:
-      - shell: |
-          #!/bin/bash
-          echo "Hello World"
+      - shell:
+          !include-raw: ./xci-start-new-vm.sh
+
+      - shell:
+          !include-raw: ./xci-start-deployment.sh
 
 - builder:
     name: 'xci-merge-healthcheck-macro'
     builders:
-      - shell: |
-          #!/bin/bash
-          echo "Hello World"
+      - shell:
+          !include-raw: ./xci-run-functest.sh
 
 - builder:
     name: 'xci-merge-promote-macro'
     builders:
-      - shell: |
-          #!/bin/bash
-          echo "Hello World"
+      - shell:
+          !include-raw: ./xci-promote.sh
index 62818ab..d8d61be 100755 (executable)
@@ -23,11 +23,29 @@ if [[ "$GERRIT_TOPIC" =~ skip-verify|skip-deployment ]]; then
     exit 0
 fi
 
-# skip the deployment if the scenario is not supported on this distro
-OPNFV_SCENARIO_REQUIREMENTS=$WORKSPACE/xci/opnfv-scenario-requirements.yml
-if ! sed -n "/^- scenario: $DEPLOY_SCENARIO$/,/^$/p" $OPNFV_SCENARIO_REQUIREMENTS | grep -q $DISTRO; then
-    echo "# SKIPPED: Scenario $DEPLOY_SCENARIO is NOT supported on $DISTRO"
-    exit 0
+# fail if promotion metadata file doesn't exist
+if [ ! -f $LOCAL_PROMOTION_METADATA_FILE ]; then
+    echo "Unable to find promotion metadata file $LOCAL_PROMOTION_METADATA_FILE"
+    echo "Skipping promotion!"
+    exit 1
 fi
 
-echo "Hello World!"
+# put additional info into the metadata file so we can use that for displaying the information
+echo "PROMOTED_BY=$BUILD_URL" >> $LOCAL_PROMOTION_METADATA_FILE
+echo "PROMOTED_ON=$(date -u '+%F_%H:%M'UTC)" >> $LOCAL_PROMOTION_METADATA_FILE
+
+# upload promotion metadata file to OPNFV artifact repo
+echo "Storing promotion metadata as $REMOTE_PROMOTION_METADATA_FILE"
+gsutil cp $LOCAL_PROMOTION_METADATA_FILE $REMOTE_PROMOTION_METADATA_FILE > /dev/null 2>&1
+
+# update the file metadata on gs to prevent the use of cached version of the file
+gsutil -m setmeta -r -h "Content-Type:text/html" \
+    -h "Cache-Control:private, max-age=0, no-transform" \
+    $REMOTE_PROMOTION_METADATA_FILE > /dev/null 2>&1
+
+# log the metadata to console
+echo "Stored the metadata for $DEPLOY_SCENARIO"
+echo "---------------------------------------------------------------------------------"
+gsutil cat $REMOTE_PROMOTION_METADATA_FILE
+echo "---------------------------------------------------------------------------------"
+echo "Scenario $DEPLOY_SCENARIO has successfully been promoted!"
index 1f616de..aa98e07 100755 (executable)
@@ -7,9 +7,7 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-set -o errexit
 set -o nounset
-set -o pipefail
 
 #----------------------------------------------------------------------
 # This script is used by CI and executed by Jenkins jobs.
@@ -51,10 +49,18 @@ if ! sed -n "/^- scenario: $DEPLOY_SCENARIO$/,/^$/p" $OPNFV_SCENARIO_REQUIREMENT
     exit 0
 fi
 
-ssh -F $HOME/.ssh/${DISTRO}-xci-vm-config ${DISTRO}_xci_vm_opnfv "cd /root/releng-xci/xci/playbooks && ansible-playbook -i inventory prepare-functest.yml"
+# set XCI_VENV for ansible
+export XCI_VENV=/home/devuser/releng-xci/venv
+
+ssh -F $HOME/.ssh/${DISTRO}-xci-vm-config ${DISTRO}_xci_vm "source $XCI_VENV/bin/activate; cd releng-xci/xci && ansible-playbook -i installer/osa/files/$XCI_FLAVOR/inventory playbooks/prepare-functest.yml"
 echo "Running functest"
 ssh -F $HOME/.ssh/${DISTRO}-xci-vm-config ${DISTRO}_xci_vm_opnfv "/root/run-functest.sh"
 echo "Functest log"
 echo "---------------------------------------------------------------------------------"
 ssh -F $HOME/.ssh/${DISTRO}-xci-vm-config ${DISTRO}_xci_vm_opnfv "cat /root/results/functest.log"
 echo "---------------------------------------------------------------------------------"
+# check the log to see if we have any error
+if ssh -F $HOME/.ssh/${DISTRO}-xci-vm-config ${DISTRO}_xci_vm_opnfv "grep -q 'FAIL' /root/results/functest.log"; then
+    echo "Error: Functest failed!"
+    exit 1
+fi
index c602957..c3012cd 100755 (executable)
@@ -42,20 +42,22 @@ set -o pipefail
 function override_generic_scenario() {
     echo "Processing $GERRIT_PROJECT patchset $GERRIT_REFSPEC"
 
+    # ensure the metadata we record is consistent for all types of patches including skipped ones
+    # extract releng-xci sha
+    XCI_SHA=$(cd $WORKSPACE && git rev-parse HEAD)
+
+    # extract scenario sha which is same as releng-xci sha for generic scenarios
+    SCENARIO_SHA=$XCI_SHA
+
     # process topic branch names
-    if [[ "$GERRIT_TOPIC" =~ skip-verify|skip-deployment ]]; then
-        # skip the real verification
-        echo "Skipping verify!"
-        echo "INSTALLER_TYPE=osa" > $WORK_DIRECTORY/scenario.properties
-        echo "DEPLOY_SCENARIO=os-nosdn-nofeature" >> $WORK_DIRECTORY/scenario.properties
-        exit 0
-    elif [[ "$GERRIT_TOPIC" =~ 'force-verify' ]]; then
-        # Run the deployment with default installer and scenario when multiple things change
-        # and we want to force that.
-        echo "Recording the installer 'osa' and scenario 'os-nosdn-nofeature' for downstream jobs"
-        echo "Forcing CI verification of default scenario and installer!"
+    if [[ "$GERRIT_TOPIC" =~ skip-verify|skip-deployment|force-verify ]]; then
+        [[ "$GERRIT_TOPIC" =~ force-verify ]] && echo "Forcing CI verification using default scenario and installer!"
+        [[ "$GERRIT_TOPIC" =~ skip-verify|skip-deployment ]] && echo "Skipping verification!"
         echo "INSTALLER_TYPE=osa" > $WORK_DIRECTORY/scenario.properties
         echo "DEPLOY_SCENARIO=os-nosdn-nofeature" >> $WORK_DIRECTORY/scenario.properties
+        echo "XCI_SHA=$XCI_SHA" >> $WORK_DIRECTORY/scenario.properties
+        echo "SCENARIO_SHA=$SCENARIO_SHA" >> $WORK_DIRECTORY/scenario.properties
+        echo "PROJECT_NAME=$GERRIT_PROJECT" >> $WORK_DIRECTORY/scenario.properties
         exit 0
     fi
 
@@ -70,6 +72,9 @@ function override_generic_scenario() {
             echo "Recording the installer '$INSTALLER_TYPE' and scenario '$DEPLOY_SCENARIO' for downstream jobs"
             echo "INSTALLER_TYPE=$INSTALLER_TYPE" > $WORK_DIRECTORY/scenario.properties
             echo "DEPLOY_SCENARIO=$DEPLOY_SCENARIO" >> $WORK_DIRECTORY/scenario.properties
+            echo "XCI_SHA=$XCI_SHA" >> $WORK_DIRECTORY/scenario.properties
+            echo "SCENARIO_SHA=$SCENARIO_SHA" >> $WORK_DIRECTORY/scenario.properties
+            echo "PROJECT_NAME=$GERRIT_PROJECT" >> $WORK_DIRECTORY/scenario.properties
             exit 0
         fi
     else
@@ -110,10 +115,10 @@ function determine_generic_scenario() {
     done
 
     # extract releng-xci sha
-    RELENG_XCI_SHA=$(cd $WORKSPACE && git rev-parse HEAD)
+    XCI_SHA=$(cd $WORKSPACE && git rev-parse HEAD)
 
     # extract scenario sha which is same as releng-xci sha for generic scenarios
-    SCENARIO_SHA=$RELENG_XCI_SHA
+    SCENARIO_SHA=$XCI_SHA
 }
 
 # This function determines the impacted external scenario by processing the Gerrit
@@ -142,7 +147,7 @@ function determine_external_scenario() {
     DEPLOY_SCENARIO+=$(git diff HEAD^..HEAD --name-only | grep scenarios | awk -F '[/|/]' '{print $2}' | uniq)
 
     # extract releng-xci sha
-    RELENG_XCI_SHA=$(cd $WORKSPACE && git rev-parse HEAD)
+    XCI_SHA=$(cd $WORKSPACE && git rev-parse HEAD)
 
     # extract scenario sha
     SCENARIO_SHA=$(cd $WORK_DIRECTORY/$GERRIT_PROJECT && git rev-parse HEAD)
@@ -194,8 +199,9 @@ esac
 echo "Recording the installer '$INSTALLER_TYPE' and scenario '${DEPLOY_SCENARIO[0]}' and SHAs for downstream jobs"
 echo "INSTALLER_TYPE=$INSTALLER_TYPE" > $WORK_DIRECTORY/scenario.properties
 echo "DEPLOY_SCENARIO=$DEPLOY_SCENARIO" >> $WORK_DIRECTORY/scenario.properties
-echo "RELENG_XCI_SHA=$RELENG_XCI_SHA" >> $WORK_DIRECTORY/scenario.properties
+echo "XCI_SHA=$XCI_SHA" >> $WORK_DIRECTORY/scenario.properties
 echo "SCENARIO_SHA=$SCENARIO_SHA" >> $WORK_DIRECTORY/scenario.properties
+echo "PROJECT_NAME=$GERRIT_PROJECT" >> $WORK_DIRECTORY/scenario.properties
 
 # skip scenario support check if the job is promotion job
 if [[ "$JOB_NAME" =~ (os|k8) ]]; then
index 7874e67..dd953e9 100755 (executable)
@@ -63,6 +63,9 @@ export OPNFV_RELENG_DEV_PATH=/home/devuser/releng-xci/
 export INSTALLER_TYPE=$INSTALLER_TYPE
 export GIT_BASE=$GIT_BASE
 export JENKINS_HOME=$JENKINS_HOME
+export CI_LOOP=$CI_LOOP
+export BUILD_TAG=$BUILD_TAG
+export NODE_NAME=$NODE_NAME
 
 if [[ ! -z ${WORKSPACE+x} && $GERRIT_PROJECT != "releng-xci" ]]; then
     git clone https://gerrit.opnfv.org/gerrit/$GERRIT_PROJECT xci/scenarios/$DEPLOY_SCENARIO && cd xci/scenarios/$DEPLOY_SCENARIO
index d78dc82..e5c1a93 100644 (file)
       - string:
           name: CLEAN_DIB_IMAGES
           default: 'true'
+      - string:
+          name: CI_LOOP
+          default: 'verify'
+      - string:
+          name: FUNCTEST_MODE
+          default: 'tier'
+      - string:
+          name: FUNCTEST_SUITE_NAME
+          default: 'healthcheck'
       - string:
           name: GIT_BASE
           default: https://gerrit.opnfv.org/gerrit/$PROJECT
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
                 GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
                 GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
+                CI_LOOP=$CI_LOOP
               node-parameters: true
               kill-phase-on: FAILURE
               abort-all-job: true
                 GERRIT_REFSPEC=$GERRIT_REFSPEC
                 GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
                 GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
-                FUNCTEST_MODE=tier
-                FUNCTEST_TIER=healthcheck
+                CI_LOOP=$CI_LOOP
+                FUNCTEST_MODE=$FUNCTEST_MODE
+                FUNCTEST_SUITE_NAME=$FUNCTEST_SUITE_NAME
               node-parameters: true
               kill-phase-on: NEVER
               abort-all-job: true
       - string:
           name: DISTRO
           default: 'ubuntu'
+      - string:
+          name: CI_LOOP
+          default: 'verify'
       - string:
           name: FUNCTEST_MODE
           default: 'tier'
index 20890fa..24c7f31 100644 (file)
       - description-setter:
           description: "POD: $NODE_NAME"
       - 'yardstick-cleanup'
-      - 'yardstick-fetch-os-creds'
-      - 'yardstick-fetch-k8s-conf'
+      - 'yardstick-fetch-creds'
       - 'yardstick-{testsuite}'
       - 'yardstick-store-results'
 
           !include-raw: ./yardstick-daily.sh
 
 - builder:
-    name: yardstick-fetch-os-creds
+    name: yardstick-fetch-creds
     builders:
-      - shell:
-          !include-raw: ../../utils/fetch_os_creds.sh
-
-- builder:
-    name: yardstick-fetch-k8s-conf
-    builders:
-      - shell:
-          !include-raw: ./yardstick-get-k8s-conf.sh
+      # yamllint disable rule:indentation
+      - conditional-step:
+          condition-kind: regex-match
+          regex: "os-.*"
+          label: '$DEPLOY_SCENARIO'
+          steps:
+            - shell:
+                !include-raw: ../../utils/fetch_os_creds.sh
+      - conditional-step:
+          condition-kind: regex-match
+          regex: "k8-.*"
+          label: '$DEPLOY_SCENARIO'
+          steps:
+            - shell:
+                !include-raw: ./yardstick-get-k8s-conf.sh
 
 - builder:
     name: yardstick-store-results
index 22a6aa4..116d2f0 100755 (executable)
@@ -7,6 +7,7 @@ if [[ "${DEPLOY_SCENARIO:0:2}" == "k8" ]];then
     if [[ ${INSTALLER_TYPE} == 'joid' ]];then
         juju scp kubernetes-master/0:config "${dest_path}"
     elif [[ ${INSTALLER_TYPE} == 'compass' ]];then
+        echo "Copy admin.conf to ${dest_path}"
         docker cp compass-tasks:/opt/admin.conf "${dest_path}"
     fi
 fi
diff --git a/releases/euphrates/apex.yaml b/releases/euphrates/apex.yaml
new file mode 100644 (file)
index 0000000..7892076
--- /dev/null
@@ -0,0 +1,37 @@
+# SPDX-License-Identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018 The Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+---
+project: apex
+project-type: installer
+release-model: stable
+upstream: https://wiki.openstack.org/wiki/TripleO
+
+releases:
+  - version: opnfv-5.0.0
+    location:
+      apex: 2f1c99daeee9cf0e89a8e833e034e7a5979ae894
+  - version: opnfv-5.1.0
+    location:
+      apex: f15d50c2009f1f865ac6f4171347940313727547
+
+branches:
+  - name: stable/euphrates
+    location:
+      apex: f27da77b87837e025907f689890b413c8f183c59
+  - name: stable/euphrates
+    location:
+      apex-tripleo-heat-templates: 676db53c4423693441112640cf362e93931161ae
+  - name: stable/euphrates
+    location:
+      apex-puppet-tripleo: 14bc31f54ea943547a3319b479ea7b8cd9661e85
+  - name: stable/euphrates
+    location:
+      apex-os-net-config: a6c3f2a2c853ca489cceff959a52d7f75bf4ffe0
+
+release-notes: http://docs.opnfv.org/en/stable-euphrates/submodules/apex/docs/release/release-notes/release-notes.html
diff --git a/releases/euphrates/armband.yaml b/releases/euphrates/armband.yaml
new file mode 100644 (file)
index 0000000..c96b1a3
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: armband
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      armband: 26f7f4fffa50452fd6e5cb5c2afbae63449afc00
diff --git a/releases/euphrates/availability.yaml b/releases/euphrates/availability.yaml
new file mode 100644 (file)
index 0000000..79f448e
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: availability
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      availability: 374fe9ba9a1fc9c10eb6fa44a25b177f1e9ad96c
diff --git a/releases/euphrates/bamboo.yaml b/releases/euphrates/bamboo.yaml
new file mode 100644 (file)
index 0000000..bbda8b8
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: bamboo
+project-type: tools
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      bamboo: 37ed3fde974e656893edbfcee2ad5f0c1b1e2011
diff --git a/releases/euphrates/barometer.yaml b/releases/euphrates/barometer.yaml
new file mode 100644 (file)
index 0000000..ac1894e
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: barometer
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      barometer: cb183a3dbe6c1bf0955a0260292709020d2ef338
diff --git a/releases/euphrates/bottlenecks.yaml b/releases/euphrates/bottlenecks.yaml
new file mode 100644 (file)
index 0000000..7c6725a
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: bottlenecks
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      bottlenecks: 0cd98516d581bc661772473be92f7e4d5a26036d
diff --git a/releases/euphrates/calipso.yaml b/releases/euphrates/calipso.yaml
new file mode 100644 (file)
index 0000000..ebccd60
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: calipso
+project-type: tools
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      calipso: c8440f4158805fed1c49d1f06cd71f324eac26a2
diff --git a/releases/euphrates/compass4nfv.yaml b/releases/euphrates/compass4nfv.yaml
new file mode 100644 (file)
index 0000000..e46e01b
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: compass4nfv
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      compass4nfv: 435cd3756a833db0515eb70c1d8ec4adca90950f
diff --git a/releases/euphrates/container4nfv.yaml b/releases/euphrates/container4nfv.yaml
new file mode 100644 (file)
index 0000000..ec5dc8e
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: container4nfv
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      container4nfv: dbd4804f6353c5ba49af784502654991520e02e6
diff --git a/releases/euphrates/daisy.yaml b/releases/euphrates/daisy.yaml
new file mode 100644 (file)
index 0000000..4f3cb15
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: daisy
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      daisy: ef7ce0b8c457cf9831d9556572ab13d7d4c660f6
diff --git a/releases/euphrates/doctor.yaml b/releases/euphrates/doctor.yaml
new file mode 100644 (file)
index 0000000..6f44997
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: doctor
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      doctor: 06980156b3eed6a6e456d3105c70b68386c1dfb7
diff --git a/releases/euphrates/domino.yaml b/releases/euphrates/domino.yaml
new file mode 100644 (file)
index 0000000..52bc01c
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: domino
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      domino: 5aca24e307f2eb11026a086fbe3db6f0cbeb6699
diff --git a/releases/euphrates/fds.yaml b/releases/euphrates/fds.yaml
new file mode 100644 (file)
index 0000000..4377bf9
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: fds
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      fds: 5eed588472406181f8182731e03eb09e2c20f588
diff --git a/releases/euphrates/fuel.yaml b/releases/euphrates/fuel.yaml
new file mode 100644 (file)
index 0000000..91d2304
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: fuel
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      fuel: fe9be64738ff1a1091e7df5b04b391fb15d6abc0
diff --git a/releases/euphrates/functest.yaml b/releases/euphrates/functest.yaml
new file mode 100644 (file)
index 0000000..f793771
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: functest
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      functest: e556a792b6b0c7275c20c779688f4ffc383b7f2a
diff --git a/releases/euphrates/ipv6.yaml b/releases/euphrates/ipv6.yaml
new file mode 100644 (file)
index 0000000..a0b4cbf
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: ipv6
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      ipv6: 79ddbacd3ee05d8605ebd103042ca9502edb626f
diff --git a/releases/euphrates/joid.yaml b/releases/euphrates/joid.yaml
new file mode 100644 (file)
index 0000000..3cbb87d
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: joid
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      joid: ba3766e175571756f690b24448cb5dfae934ad80
diff --git a/releases/euphrates/kvmfornfv.yaml b/releases/euphrates/kvmfornfv.yaml
new file mode 100644 (file)
index 0000000..7e541c4
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: kvmfornfv
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      kvmfornfv: 3a36c490d63e834ee9454553a14995be839118e3
diff --git a/releases/euphrates/moon.yaml b/releases/euphrates/moon.yaml
new file mode 100644 (file)
index 0000000..4f34046
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: moon
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      moon: 2c380003fa911fdfad85d2c7164b95160eb54963
diff --git a/releases/euphrates/nfvbench.yaml b/releases/euphrates/nfvbench.yaml
new file mode 100644 (file)
index 0000000..f51e876
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: nfvbench
+project-type: tools
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      nfvbench: cf9c95ccda2f5afbdf79c7debe5fcd88c05eaa6a
diff --git a/releases/euphrates/octopus.yaml b/releases/euphrates/octopus.yaml
new file mode 100644 (file)
index 0000000..f4a698d
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: octopus
+project-type: infra
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      octopus: 1c1b92913c93cfddb9fee16bc9c15b1873fc4e04
diff --git a/releases/euphrates/opnfvdocs.yaml b/releases/euphrates/opnfvdocs.yaml
new file mode 100644 (file)
index 0000000..0ea0796
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: opnfvdocs
+project-type: infra
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      opnfvdocs: 18d0ebca65b68e56497c08cc489e4ecc3c649fa9
diff --git a/releases/euphrates/orchestra.yaml b/releases/euphrates/orchestra.yaml
new file mode 100644 (file)
index 0000000..b97361e
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: orchestra
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      orchestra: 1f0d8ed7261f1b202476680b2e3fc2d41b399cc9
diff --git a/releases/euphrates/ovn4nfv.yaml b/releases/euphrates/ovn4nfv.yaml
new file mode 100644 (file)
index 0000000..ba60520
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: ovn4nfv
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      ovn4nfv: 2c6027fb46d1a55f767cc2882d946c794ca5843c
diff --git a/releases/euphrates/ovno.yaml b/releases/euphrates/ovno.yaml
new file mode 100644 (file)
index 0000000..39ca54c
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: ovno
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      ovno: f49eab063a13bb89bd90f583bd6d814c3a7d21d2
diff --git a/releases/euphrates/parser.yaml b/releases/euphrates/parser.yaml
new file mode 100644 (file)
index 0000000..7eb055e
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: parser
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      parser: 3447589a78375d4dab41608a3504f56a6e4ac9c9
diff --git a/releases/euphrates/pharos.yaml b/releases/euphrates/pharos.yaml
new file mode 100644 (file)
index 0000000..0237762
--- /dev/null
@@ -0,0 +1,12 @@
+---
+project: pharos
+project-type: infra
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      pharos: 1d7a94bf5ab86f28b3183f52644d00801cde815b
+  - name: stable/euphrates
+    location:
+      pharos-tools: d46ab54583a6c20bfa5bea581f512474f488e788
diff --git a/releases/euphrates/promise.yaml b/releases/euphrates/promise.yaml
new file mode 100644 (file)
index 0000000..799077f
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: promise
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      promise: 2ff86a92816faa4d71d2b0e260a5f44ce51d9b2c
diff --git a/releases/euphrates/qtip.yaml b/releases/euphrates/qtip.yaml
new file mode 100644 (file)
index 0000000..51c07d9
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: qtip
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      qtip: 3f929d991ea4ca402aaf4db46752f703771f44ea
diff --git a/releases/euphrates/samplevnf.yaml b/releases/euphrates/samplevnf.yaml
new file mode 100644 (file)
index 0000000..33f1a90
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: samplevnf
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      samplevnf: af6b18166ddbe9331c529256cb71c11e8b280982
diff --git a/releases/euphrates/sdnvpn.yaml b/releases/euphrates/sdnvpn.yaml
new file mode 100644 (file)
index 0000000..371fe9a
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: sdnvpn
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      sdnvpn: e66856ba6b9275582aa4fc370d2b9abf48b5381f
diff --git a/releases/euphrates/sfc.yaml b/releases/euphrates/sfc.yaml
new file mode 100644 (file)
index 0000000..ebd7a0e
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: sfc
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      sfc: 2b785ea6a618b031cde2fd327f33733ab9c352e9
diff --git a/releases/euphrates/snaps.yaml b/releases/euphrates/snaps.yaml
new file mode 100644 (file)
index 0000000..9aaa018
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: snaps
+project-type: tools
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      snaps: fd18b6790cd9b59851bce6746cc83f27d3e18e4f
diff --git a/releases/euphrates/storperf.yaml b/releases/euphrates/storperf.yaml
new file mode 100644 (file)
index 0000000..c7cf60c
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: storperf
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      storperf: 577bb77e605f78934260d6578bf07fb5071f3354
diff --git a/releases/euphrates/vswitchperf.yaml b/releases/euphrates/vswitchperf.yaml
new file mode 100644 (file)
index 0000000..3ae3b08
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: vswitchperf
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      vswitchperf: d126de94bea2e5d0e237dc6a3373fd3d53e3cfa3
diff --git a/releases/euphrates/yardstick.yaml b/releases/euphrates/yardstick.yaml
new file mode 100644 (file)
index 0000000..36cf6a5
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: yardstick
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      yardstick: 3431cd1801023e2ee09b520fc9f7a890677ff7b1
diff --git a/releases/fraser/apex.yaml b/releases/fraser/apex.yaml
new file mode 100644 (file)
index 0000000..70f34fa
--- /dev/null
@@ -0,0 +1,29 @@
+# SPDX-License-Identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018 The Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+---
+project: apex
+project-type: installer
+release-model: stable
+upstream: https://wiki.openstack.org/wiki/TripleO
+
+branches:
+  - name: stable/fraser
+    location:
+      apex: b047099b609eac330486f23913e8046d0f22c1ab
+  - name: stable/fraser
+    location:
+      apex-tripleo-heat-templates: 01db62fd83df2af8b7d87280919a435ee43dc40f
+  - name: stable/fraser
+    location:
+      apex-puppet-tripleo: 7e42851739337960ff1255f9c84773aa13d47bc0
+  - name: stable/fraser
+    location:
+      apex-os-net-config: a301f9f0fff8b227562fdec639e66d76dafb4634
+
+release-notes: http://docs.opnfv.org/en/stable-euphrates/submodules/apex/docs/release/release-notes/release-notes.html
diff --git a/releases/fraser/armband.yml b/releases/fraser/armband.yml
new file mode 100644 (file)
index 0000000..ae2e44d
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: armband
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      armband: 46040c0ab85aeba942b7ec7897b32243f859aac0
diff --git a/releases/fraser/auto.yaml b/releases/fraser/auto.yaml
new file mode 100644 (file)
index 0000000..fa2f58b
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: auto
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      auto: 5c8112dd4434e726da1325b0a699b9839f2f3d6b
diff --git a/releases/fraser/availability.yaml b/releases/fraser/availability.yaml
new file mode 100644 (file)
index 0000000..1b35af7
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: availability
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      availability: c1ee3631b59009ff61450808e2bd33fe1d4b17f2
diff --git a/releases/fraser/barometer.yaml b/releases/fraser/barometer.yaml
new file mode 100644 (file)
index 0000000..1ff9085
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: barometer
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      barometer: 2d98d11d981dc9e6597532f130a241cd20cc963d
diff --git a/releases/fraser/bottlenecks.yaml b/releases/fraser/bottlenecks.yaml
new file mode 100644 (file)
index 0000000..778e6ed
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: bottlenecks
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      bottlenecks: d10c4644d44f707998c7f05dc72ec4913576b752
diff --git a/releases/fraser/clover.yaml b/releases/fraser/clover.yaml
new file mode 100644 (file)
index 0000000..91758cd
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: clover
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      clover: 67b7fb49e6ea6ac9c2547af263355e5f1aeade42
diff --git a/releases/fraser/compass4nfv.yaml b/releases/fraser/compass4nfv.yaml
new file mode 100644 (file)
index 0000000..5b5c777
--- /dev/null
@@ -0,0 +1,12 @@
+---
+project: compass4nfv
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      compass4nfv: 9c5ae544e3f1adbc5bb0df1fc7388012bdf642fa
+  - name: stable/fraser
+    location:
+      compass-containers: 15a7cbc925bed896c3c09a5635454c33dbffbadc
diff --git a/releases/fraser/daisy.yaml b/releases/fraser/daisy.yaml
new file mode 100644 (file)
index 0000000..78efc48
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: daisy
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      daisy: 5bbbe44397d946b4d6fb3bdee6fba2c09131b698
diff --git a/releases/fraser/doctor.yaml b/releases/fraser/doctor.yaml
new file mode 100644 (file)
index 0000000..bc74a03
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: doctor
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      doctor: 06980156b3eed6a6e456d3105c70b68386c1dfb7
diff --git a/releases/fraser/fds.yaml b/releases/fraser/fds.yaml
new file mode 100644 (file)
index 0000000..9d08cbf
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: fds
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      fds: 6eb4ed8ce9be7135ec65318b7b833f3c487498be
diff --git a/releases/fraser/fuel.yaml b/releases/fraser/fuel.yaml
new file mode 100644 (file)
index 0000000..d0b7b19
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: fuel
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      fuel: e083cf6350a227da161b07d2c68d9aa200611b32
diff --git a/releases/fraser/functest.yaml b/releases/fraser/functest.yaml
new file mode 100644 (file)
index 0000000..9956e96
--- /dev/null
@@ -0,0 +1,12 @@
+---
+project: functest
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      functest: 99d75d87e31d4f9e078c899bd643da5474963aba
+  - name: stable/fraser
+    location:
+      functest-kubernetes: 64d61b6a116d3b12e0f4f42c3240262ea6359fd8
diff --git a/releases/fraser/ipv6.yaml b/releases/fraser/ipv6.yaml
new file mode 100644 (file)
index 0000000..853847c
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: ipv6
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      ipv6: 809dba7f52ff1571a760a01376530de23c5d97c9
diff --git a/releases/fraser/joid.yaml b/releases/fraser/joid.yaml
new file mode 100644 (file)
index 0000000..c2ca0cd
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: joid
+project-type: installer
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      joid: f1b6b2867e4e907cb84ea4670ad32f36bddcbf6c
diff --git a/releases/fraser/nfvbench.yaml b/releases/fraser/nfvbench.yaml
new file mode 100644 (file)
index 0000000..e573a8b
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: nfvbench
+project-type: tools
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      nfvbench: 34c00544f7f7dbfa49bbdcd83eca2936b60826c7
diff --git a/releases/fraser/ovn4nfv.yaml b/releases/fraser/ovn4nfv.yaml
new file mode 100644 (file)
index 0000000..a04bd02
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: ovn4nfv
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      ovn4nfv: 9623c07f59e059ed0b1cdc6fdfec9c7d9996d88d
diff --git a/releases/fraser/samplevnf.yaml b/releases/fraser/samplevnf.yaml
new file mode 100644 (file)
index 0000000..c6eda5a
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: samplevnf
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      samplevnf: b38082760fc411a8fc9e74f9c2d3a44ad633db5c
diff --git a/releases/fraser/sdnvpn.yaml b/releases/fraser/sdnvpn.yaml
new file mode 100644 (file)
index 0000000..b0a3906
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: sdnvpn
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      sdnvpn: cc10bd492affb033b68d3b8f4cb1d8c9d554f995
diff --git a/releases/fraser/sfc.yaml b/releases/fraser/sfc.yaml
new file mode 100644 (file)
index 0000000..d423020
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: sfc
+project-type: feature
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      sfc: 9dda531e8e9be93b930b89d45a395085fbcb61cc
diff --git a/releases/fraser/storperf.yaml b/releases/fraser/storperf.yaml
new file mode 100644 (file)
index 0000000..4a1734c
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: storperf
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/euphrates
+    location:
+      storperf: ce8adafbccb4bc37930f95561fa24874906013ad
diff --git a/releases/fraser/vswitchperf.yaml b/releases/fraser/vswitchperf.yaml
new file mode 100644 (file)
index 0000000..bcf60e7
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: vswitchperf
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      vswitchperf: a87a7696e58082b10fadef24176d53ebc67f3bd5
diff --git a/releases/fraser/yardstick.yaml b/releases/fraser/yardstick.yaml
new file mode 100644 (file)
index 0000000..53bcfa6
--- /dev/null
@@ -0,0 +1,9 @@
+---
+project: yardstick
+project-type: testing
+release-model: stable
+
+branches:
+  - name: stable/fraser
+    location:
+      yardstick: f19016b39b828f648a66adc305cce17f5146e922
diff --git a/releases/schema.yaml b/releases/schema.yaml
new file mode 100644 (file)
index 0000000..c383876
--- /dev/null
@@ -0,0 +1,56 @@
+##############################################################################
+# Copyright (c) 2018 Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+---
+$schema: 'http://json-schema.org/schema#'
+$id: 'https://github.com/opnfv/releng/blob/master/releases/schema.yaml'
+
+additionalProperties: false
+
+required:
+  - 'project'
+  - 'project-type'
+
+properties:
+  project:
+    type: 'string'
+  release-model:
+    type: 'string'
+    enum: ['stable', 'non-release']
+  project-type:
+    type: 'string'
+    enum: ['installer', 'testing', 'feature', 'tools', 'infra']
+  upstream:
+    type: 'string'
+  releases:
+    type: 'array'
+    items:
+      type: 'object'
+      properties:
+        version:
+          type: 'string'
+          # Matches semantic versioning (X.Y.Z)
+          pattern: '^opnfv-([0-9]+\.){2}[0-9]+$'
+        location:
+          type: 'object'
+      required: ['version', 'location']
+      additionalProperties: false
+  branches:
+    type: 'array'
+    items:
+      type: 'object'
+      properties:
+        name:
+          type: 'string'
+          pattern: '^stable/[a-z]+$'
+        location:
+          type: 'object'
+      required: ['name', 'location']
+      additionalProperties: false
+  release-notes:
+    type: 'string'
+    format: 'uri'
diff --git a/releases/scripts/create_branch.py b/releases/scripts/create_branch.py
new file mode 100644 (file)
index 0000000..fa3c92d
--- /dev/null
@@ -0,0 +1,143 @@
+#!/usr/bin/env python2
+# SPDX-License-Identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018 The Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+"""
+Create Gerrit Branchs
+"""
+
+import argparse
+
+try:
+    import ConfigParser
+except ImportError:
+    import configparser as ConfigParser
+
+import logging
+import os
+import yaml
+
+from requests.compat import quote
+from requests.exceptions import RequestException
+
+from pygerrit2.rest import GerritRestAPI
+from pygerrit2.rest.auth import HTTPDigestAuthFromNetrc, HTTPBasicAuthFromNetrc
+
+
+logging.basicConfig(level=logging.INFO)
+
+
+def quote_branch(arguments):
+    """
+    Quote is used here to escape the '/' in branch name. By
+    default '/' is listed in 'safe' characters which aren't escaped.
+    quote is not used in the data of the PUT request, as quoting for
+    arguments is handled by the request library
+    """
+    new_args = arguments.copy()
+    new_args['branch'] = quote(new_args['branch'], '')
+    return new_args
+
+
+def create_branch(api, arguments):
+    """
+    Create a branch using the Gerrit REST API
+    """
+    logger = logging.getLogger(__file__)
+
+    branch_data = """
+    {
+      "ref": "%(branch)s"
+      "revision": "%(commit)s"
+    }""" % arguments
+
+    # First verify the commit exists, otherwise the branch will be
+    # created at HEAD
+    try:
+        request = api.get("/projects/%(project)s/commits/%(commit)s" %
+                          arguments)
+        logger.debug(request)
+        logger.debug("Commit exists: %(commit)s", arguments)
+    except RequestException as err:
+        if hasattr(err, 'response') and err.response.status_code in [404]:
+            logger.warn("Commit %(commit)s for %(project)s does"
+                        " not exist. Not creating branch.", arguments)
+            logger.warn(err)
+        else:
+            logger.error("Error: %s", str(err))
+        # Skip trying to create the branch
+        return
+
+    # Try to create the branch and let us know if it already exist.
+    try:
+        request = api.put("/projects/%(project)s/branches/%(branch)s" %
+                          quote_branch(arguments), branch_data)
+        logger.info("Branch %(branch)s for %(project)s successfully created",
+                    arguments)
+    except RequestException as err:
+        if hasattr(err, 'response') and err.response.status_code in [412, 409]:
+            logger.info("Branch %(branch)s already created for %(project)s",
+                        arguments)
+            logger.info(err)
+        else:
+            logger.error("Error: %s", str(err))
+
+
+def main():
+    """Given a yamlfile that follows the release syntax, create branches
+    in Gerrit listed under branches"""
+
+    config = ConfigParser.ConfigParser()
+    config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)),
+                'defaults.cfg'))
+    config.read([os.path.expanduser('~/releases.cfg'), 'releases.cfg'])
+
+    gerrit_url = config.get('gerrit', 'url')
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--file', '-f',
+                        type=argparse.FileType('r'),
+                        required=True)
+    parser.add_argument('--basicauth', '-b', action='store_true')
+    args = parser.parse_args()
+
+    GerritAuth = HTTPDigestAuthFromNetrc
+    if args.basicauth:
+        GerritAuth = HTTPBasicAuthFromNetrc
+
+    try:
+        auth = GerritAuth(url=gerrit_url)
+    except ValueError as err:
+        logging.error("%s for %s", err, gerrit_url)
+        quit(1)
+    restapi = GerritRestAPI(url=gerrit_url, auth=auth)
+
+    project = yaml.safe_load(args.file)
+
+    create_branches(restapi, project)
+
+
+def create_branches(restapi, project):
+    """Create branches for a specific project defined in the release
+    file"""
+
+    branches = []
+    for branch in project['branches']:
+        repo, ref = next(iter(branch['location'].items()))
+        branches.append({
+            'project': repo,
+            'branch': branch['name'],
+            'commit': ref
+        })
+
+    for branch in branches:
+        create_branch(restapi, branch)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/releases/scripts/create_jobs.py b/releases/scripts/create_jobs.py
new file mode 100644 (file)
index 0000000..2478217
--- /dev/null
@@ -0,0 +1,145 @@
+#!/usr/bin/env python2
+# SPDX-License-Identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018 The Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+"""
+Create Gerrit Branches
+"""
+
+import argparse
+import logging
+import os
+import re
+import yaml
+import subprocess
+
+# import ruamel
+from ruamel.yaml import YAML
+
+
+logging.basicConfig(level=logging.INFO)
+
+
+def has_string(filepath, string):
+    """
+    Return True if the given filepath contains the regex string
+    """
+    with open(filepath) as yaml_file:
+        for line in yaml_file:
+            if string.search(line):
+                return True
+    return False
+
+
+def jjb_files(project, release):
+    """
+    Return sets of YAML file names that contain 'stream' for a given
+    project, and file that already contain the stream.
+    """
+    files, skipped = set(), set()
+    file_ending = re.compile(r'ya?ml$')
+    search_string = re.compile(r'^\s+stream:')
+    release_string = re.compile(r'- %s:' % release)
+    jjb_path = os.path.join('jjb', project)
+
+    if not os.path.isdir(jjb_path):
+        logging.warn("JJB directory does not exist at %s, skipping job "
+                     "creation", jjb_path)
+        return (files, skipped)
+
+    for file_name in os.listdir(jjb_path):
+        file_path = os.path.join(jjb_path, file_name)
+        if os.path.isfile(file_path) and file_ending.search(file_path):
+            if has_string(file_path, release_string):
+                skipped.add(file_path)
+            elif has_string(file_path, search_string):
+                files.add(file_path)
+    return (files, skipped)
+
+
+def main():
+    """
+    Create Jenkins Jobs for stable branches in Release File
+    """
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--file', '-f',
+                        type=argparse.FileType('r'),
+                        required=True)
+    args = parser.parse_args()
+
+    project_yaml = yaml.safe_load(args.file)
+
+    # Get the release name from the file path
+    release = os.path.split(os.path.dirname(args.file.name))[1]
+
+    create_jobs(release, project_yaml)
+
+
+def create_jobs(release, project_yaml):
+    """Add YAML to JJB files for release stream"""
+    logger = logging.getLogger(__file__)
+
+    # We assume here project keep their subrepo jobs under the part
+    # project name. Otherwise we'll have to look for jjb/<repo> for each
+    # branch listed.
+    project, _ = next(iter(project_yaml['branches'][0]['location'].items()))
+
+    yaml_parser = YAML()
+    yaml_parser.preserve_quotes = True
+    yaml_parser.explicit_start = True
+    # yaml_parser.indent(mapping=4, sequence=0, offset=0)
+    # These are some esoteric values that produce indentation matching our jjb
+    # configs
+    # yaml_parser.indent(mapping=3, sequence=3, offset=2)
+    # yaml_parser.indent(sequence=4, offset=2)
+    yaml_parser.indent(mapping=2, sequence=4, offset=2)
+
+    (job_files, skipped_files) = jjb_files(project, release)
+
+    if skipped_files:
+        logger.info("Jobs already exists for %s in files: %s",
+                    project, ', '.join(skipped_files))
+    # Exit if there are not jobs to create
+    if not job_files:
+        return
+    logger.info("Creating Jenkins Jobs for %s in files: %s",
+                project, ', '.join(job_files))
+
+    stable_branch_stream = """\
+      %s:
+          branch: 'stable/{stream}'
+          gs-pathname: '/{stream}'
+          disabled: false
+    """ % release
+
+    stable_branch_yaml = yaml_parser.load(stable_branch_stream)
+    stable_branch_yaml[release].yaml_set_anchor(release, always_dump=True)
+
+    for job_file in job_files:
+        yaml_jjb = yaml_parser.load(open(job_file))
+        if 'stream' not in yaml_jjb[0]['project']:
+            continue
+
+        # TODO: Some JJB files don't have 'stream'
+        project_config = yaml_jjb[0]['project']['stream']
+        # There is an odd issue where just appending adds a newline before the
+        # branch config, so we append (presumably after master) instead.
+        project_config.insert(1, stable_branch_yaml)
+
+        # NOTE: In the future, we may need to override one or multiple of the
+        #       following ruamal Emitter methods:
+        #         * ruamel.yaml.emitter.Emitter.expect_block_sequence_item
+        #         * ruamel.yaml.emitter.Emitter.write_indent
+        #       To hopefully replace the need to shell out to sed...
+        yaml_parser.dump(yaml_jjb, open(job_file, 'w'))
+        args = ['sed', '-i', 's/^  //', job_file]
+        subprocess.Popen(args, stdout=subprocess.PIPE, shell=False)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/releases/scripts/defaults.cfg b/releases/scripts/defaults.cfg
new file mode 100644 (file)
index 0000000..6bc8765
--- /dev/null
@@ -0,0 +1,2 @@
+[gerrit]
+url=https://gerrit.opnfv.org/gerrit/
diff --git a/releases/scripts/requirements.txt b/releases/scripts/requirements.txt
new file mode 100644 (file)
index 0000000..5a7d216
--- /dev/null
@@ -0,0 +1,5 @@
+pygerrit2 < 2.1.0
+PyYAML < 4.0
+jsonschema < 2.7.0
+rfc3987
+ruamel.yaml
diff --git a/releases/scripts/verify_schema.py b/releases/scripts/verify_schema.py
new file mode 100644 (file)
index 0000000..3a6163e
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/env python2
+# SPDX-License-Identifier: Apache-2.0
+##############################################################################
+# Copyright (c) 2018 The Linux Foundation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+"""
+Verify YAML Schema
+"""
+import argparse
+import logging
+import jsonschema
+import yaml
+
+LOADER = yaml.CSafeLoader if yaml.__with_libyaml__ else yaml.SafeLoader
+
+
+def main():
+    """
+    Parse arguments and verify YAML
+    """
+    logging.basicConfig(level=logging.INFO)
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--yaml', '-y', type=str, required=True)
+    parser.add_argument('--schema', '-s', type=str, required=True)
+
+    args = parser.parse_args()
+
+    with open(args.yaml) as _:
+        yaml_file = yaml.load(_, Loader=LOADER)
+
+    with open(args.schema) as _:
+        schema_file = yaml.load(_, Loader=LOADER)
+
+    # Load the schema
+    validation = jsonschema.Draft4Validator(
+        schema_file,
+        format_checker=jsonschema.FormatChecker()
+    )
+
+    # Look for errors
+    errors = 0
+    for error in validation.iter_errors(yaml_file):
+        errors += 1
+        logging.error(error)
+    if errors > 0:
+        raise RuntimeError("%d issues invalidate the release schema" % errors)
+
+
+if __name__ == "__main__":
+    main()
index 0fcea0d..a87e399 100644 (file)
@@ -32,7 +32,7 @@ node_list=(\
 'huawei-pod6' 'huawei-pod7' 'huawei-pod12' \
 'huawei-virtual1' 'huawei-virtual2' 'huawei-virtual3' 'huawei-virtual4' \
 'huawei-virtual5' 'huawei-virtual8' 'huawei-virtual9' \
-'zte-pod2' 'zte-pod3' \
+'zte-pod2' 'zte-pod3' 'zte-pod9' \
 'zte-virtual1')