Merge "bug fix: last 4 run reporting for storperf"
authorMorgan Richomme <morgan.richomme@orange.com>
Tue, 7 Mar 2017 15:57:38 +0000 (15:57 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Tue, 7 Mar 2017 15:57:38 +0000 (15:57 +0000)
53 files changed:
docs/jenkins-job-builder/opnfv-jjb-usage.rst
jjb/apex/apex.yml
jjb/compass4nfv/compass-ci-jobs.yml
jjb/compass4nfv/compass-verify-jobs.yml
jjb/daisy4nfv/daisy4nfv-download-artifact.sh
jjb/doctor/doctor.yml
jjb/dovetail/dovetail-ci-jobs.yml
jjb/fuel/fuel-basic-exp.sh [deleted file]
jjb/fuel/fuel-build-exp.sh [deleted file]
jjb/fuel/fuel-daily-jobs.yml
jjb/fuel/fuel-deploy-exp.sh [deleted file]
jjb/fuel/fuel-deploy.sh
jjb/fuel/fuel-smoke-test-exp.sh [deleted file]
jjb/fuel/fuel-verify-jobs-experimental.yml [deleted file]
jjb/fuel/fuel-weekly-jobs.yml [new file with mode: 0644]
jjb/functest/functest-daily-jobs.yml [moved from jjb/functest/functest-ci-jobs.yml with 93% similarity]
jjb/functest/functest-weekly-jobs.yml [new file with mode: 0644]
jjb/global/releng-macros.yml
jjb/infra/bifrost-cleanup-job.yml
jjb/multisite/fuel-deploy-for-multisite.sh
jjb/opera/opera-daily-jobs.yml
jjb/opnfvdocs/docs-rtd.yaml
jjb/opnfvdocs/opnfvdocs.yml
jjb/parser/parser.yml
jjb/qtip/qtip-validate-jobs.yml
jjb/releng/opnfv-lint.yml
jjb/snaps/snaps.yml [new file with mode: 0644]
modules/opnfv/deployment/fuel/adapter.py
utils/test/reporting/api/handlers/landing.py
utils/test/reporting/api/install.sh [new file with mode: 0755]
utils/test/reporting/docker/reporting.sh
utils/test/reporting/docker/supervisor.conf
utils/test/reporting/pages/angular.sh [new file with mode: 0755]
utils/test/reporting/pages/app/images/green.png [new file with mode: 0644]
utils/test/reporting/pages/app/images/green@2x.png [new file with mode: 0644]
utils/test/reporting/pages/app/index.html
utils/test/reporting/pages/app/scripts/app.config.js [new file with mode: 0644]
utils/test/reporting/pages/app/scripts/app.js
utils/test/reporting/pages/app/scripts/config.js
utils/test/reporting/pages/app/scripts/config.router.js
utils/test/reporting/pages/app/scripts/controllers/main.controller.js [new file with mode: 0644]
utils/test/reporting/pages/app/scripts/controllers/table.controller.js
utils/test/reporting/pages/app/scripts/data.json [deleted file]
utils/test/reporting/pages/app/scripts/factory/table.factory.js
utils/test/reporting/pages/app/styles/custome.css
utils/test/reporting/pages/app/styles/fonts/glyphicons-halflings-regular.svg
utils/test/reporting/pages/app/views/commons/table.html
utils/test/reporting/pages/app/views/main.html
utils/test/reporting/pages/bower.json
utils/test/reporting/pages/test/karma.conf.js
utils/test/testapi/opnfv_testapi/resources/models.py
utils/test/testapi/opnfv_testapi/resources/scenario_models.py
utils/test/testapi/opnfv_testapi/tests/unit/test_scenario.py

index fc968f8..52dbdeb 100644 (file)
@@ -70,6 +70,7 @@ reviewed and submitted.
 * jose.lausuch@ericsson.com
 * koffirodrigue@gmail.com
 * r-mibu@cq.jp.nec.com
+* tbramwell@linuxfoundation.org
 
 Or Add the group releng-contributors
 
@@ -81,4 +82,4 @@ in `releng-jobs.yaml`_.
 .. _releng-jobs.yaml:
     https://gerrit.opnfv.org/gerrit/gitweb?p=releng.git;a=blob;f=jjb/releng-jobs.yaml;
 .. _skip vote:
-    https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger#GerritTrigger-SkipVote
\ No newline at end of file
+    https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger#GerritTrigger-SkipVote
index 126651e..ac1ef49 100644 (file)
                 build-step-failure-threshold: 'never'
                 failure-threshold: 'never'
                 unstable-threshold: 'FAILURE'
+        # 1.dovetail only master by now, not sync with A/B/C branches
+        # 2.here the stream means the SUT stream, dovetail stream is defined in its own job
+        # 3.only debug testsuite here(includes basic testcase,
+        #   i.e. one tempest smoke ipv6, two vping from functest)
+        # 4.not used for release criteria or compliance,
+        #   only to debug the dovetail tool bugs with apex
+        - trigger-builds:
+            - project: 'dovetail-apex-{slave}-debug-{stream}'
+              current-parameters: false
+              predefined-parameters:
+                DEPLOY_SCENARIO=os-nosdn-nofeature-ha
+              block: true
+              same-node: true
+              block-thresholds:
+                build-step-failure-threshold: 'never'
+                failure-threshold: 'never'
+                unstable-threshold: 'FAILURE'
         - trigger-builds:
           - project: 'apex-deploy-baremetal-os-odl_l3-nofeature-ha-{stream}'
             predefined-parameters: |
index 7258e89..5ccd4b5 100644 (file)
         - 'os-nosdn-kvm-ha':
             disabled: false
             auto-trigger-name: 'compass-{scenario}-{pod}-{stream}-trigger'
+        - 'os-nosdn-openo-ha':
+            disabled: false
+            auto-trigger-name: 'compass-{scenario}-{pod}-{stream}-trigger'
+
 
     jobs:
         - 'compass-{scenario}-{pod}-daily-{stream}'
     name: 'compass-os-nosdn-nofeature-ha-baremetal-centos-master-trigger'
     triggers:
         - timed: '0 19 * * *'
+- trigger:
+    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:
     name: 'compass-os-nosdn-nofeature-ha-baremetal-master-trigger'
     triggers:
         - timed: '0 2 * * *'
+- trigger:
+    name: 'compass-os-nosdn-openo-ha-baremetal-master-trigger'
+    triggers:
+        - timed: '0 3 * * *'
 - trigger:
     name: 'compass-os-odl_l2-nofeature-ha-baremetal-master-trigger'
     triggers:
     name: 'compass-os-nosdn-nofeature-ha-baremetal-danube-trigger'
     triggers:
         - timed: ''
+- trigger:
+    name: 'compass-os-nosdn-openo-ha-baremetal-danube-trigger'
+    triggers:
+        - timed: ''
 - trigger:
     name: 'compass-os-odl_l2-nofeature-ha-baremetal-danube-trigger'
     triggers:
     name: 'compass-os-nosdn-nofeature-ha-virtual-master-trigger'
     triggers:
         - timed: '0 21 * * *'
+- trigger:
+    name: 'compass-os-nosdn-openo-ha-virtual-master-trigger'
+    triggers:
+        - timed: '0 22 * * *'
 - trigger:
     name: 'compass-os-odl_l2-nofeature-ha-virtual-master-trigger'
     triggers:
     name: 'compass-os-nosdn-nofeature-ha-virtual-danube-trigger'
     triggers:
         - timed: '0 21 * * *'
+- trigger:
+    name: 'compass-os-nosdn-openo-ha-virtual-danube-trigger'
+    triggers:
+        - timed: '0 22 * * *'
 - trigger:
     name: 'compass-os-odl_l2-nofeature-ha-virtual-danube-trigger'
     triggers:
index d581380..039b30a 100644 (file)
                   node-parameters: true
                   kill-phase-on: FAILURE
                   abort-all-job: true
+                - name: 'opnfv-yamllint-verify-{stream}'
+                  current-parameters: true
+                  node-parameters: true
+                  kill-phase-on: FAILURE
+                  abort-all-job: true
         - multijob:
             name: deploy-virtual
             condition: SUCCESSFUL
index b9af2e8..1cc0443 100755 (executable)
@@ -36,6 +36,25 @@ echo "Using $OPNFV_ARTIFACT for deployment"
 
 [[ "$NODE_NAME" =~ (zte) ]] && OPNFV_ARTIFACT_URL=${GS_BASE_PROXY%%/*}/$OPNFV_ARTIFACT_URL
 
+if [[ ! "$JOB_NAME" =~ (verify|merge) ]]; then
+    # check if we already have the image to avoid redownload
+    BINSTORE="/bin_mount/opnfv_ci/${BRANCH##*/}"
+    if [[ -f "$BINSTORE/$OPNFV_ARTIFACT" && ! -z $OPNFV_ARTIFACT_SHA512SUM ]]; then
+        echo "BIN exists locally. Starting to check the sha512sum."
+        if [[ $OPNFV_ARTIFACT_SHA512SUM = $(sha512sum -b $BINSTORE/$OPNFV_ARTIFACT | cut -d' ' -f1) ]]; then
+            echo "Sha512sum is verified. Skipping the download and using the file from BIN store."
+            ln -s $BINSTORE/$OPNFV_ARTIFACT $WORKSPACE/opnfv.bin
+            echo "--------------------------------------------------------"
+            echo
+            ls -al $WORKSPACE/opnfv.bin
+            echo
+            echo "--------------------------------------------------------"
+            echo "Done!"
+            exit 0
+        fi
+    fi
+fi
+
 # log info to console
 echo "Downloading the $INSTALLER_TYPE artifact using URL http://$OPNFV_ARTIFACT_URL"
 echo "This could take some time..."
index 28888d6..c677ef9 100644 (file)
 
     builders:
         - 'clean-workspace-log'
+        - shell: |
+            # NOTE: Create symbolic link, so that we can archive file outside
+            #       of $WORKSPACE .
+            # NOTE: We are printing all logs under 'tests/' during test run,
+            #       so this symbolic link should not be in 'tests/'. Otherwise,
+            #       we'll have the same log twice in jenkins console log.
+            ln -sfn $HOME/opnfv/functest/results/{stream} functest_results
         - 'functest-suite-builder'
         - shell: |
             functest_log="$HOME/opnfv/functest/results/{stream}/{project}.log"
-            to_be_archived="$WORKSPACE/tests/functest-{project}.log"
-            cp $functest_log $to_be_archived
             # NOTE: checking the test result, as the previous job could return
             #       0 regardless the result of doctor test scenario.
             grep -e ' OK$' $functest_log || exit 1
     publishers:
         - archive:
             artifacts: 'tests/*.log'
+        - archive:
+            artifacts: 'functest_results/{project}.log'
 
 
 #####################################
index 22bc281..0bd32a4 100644 (file)
             SUT: compass
             auto-trigger-name: 'daily-trigger-disabled'
             <<: *danube
-#apex CI PODs
-        - apex-verify-master:
+#--------------------------------
+#    Installers not using labels
+#            CI PODs
+# This section should only contain the installers
+# that have not been switched using labels for slaves
+#--------------------------------
+#apex PODs
+        - lf-pod1:
             slave-label: '{pod}'
             SUT: apex
             auto-trigger-name: 'daily-trigger-disabled'
             <<: *master
-        - apex-daily-master:
+        - lf-pod1:
             slave-label: '{pod}'
             SUT: apex
             auto-trigger-name: 'daily-trigger-disabled'
-            <<: *master
-#        - apex-verify-colorado:
-#            slave-label: '{pod}'
-#            SUT: apex
-#            auto-trigger-name: 'daily-trigger-disabled'
-#            <<: *danube
-#        - apex-daily-colorado:
-#            slave-label: '{pod}'
-#            SUT: apex
-#            auto-trigger-name: 'daily-trigger-disabled'
-#            <<: *danube
+            <<: *danube
 #armband CI PODs
         - armband-baremetal:
             slave-label: armband-baremetal
diff --git a/jjb/fuel/fuel-basic-exp.sh b/jjb/fuel/fuel-basic-exp.sh
deleted file mode 100755 (executable)
index a70a0c7..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-set -o nounset
-
-echo "-----------------------------------------------------------------------"
-echo $GERRIT_CHANGE_COMMIT_MESSAGE
-echo "-----------------------------------------------------------------------"
-
-# proposal for specifying the scenario name in commit message
-# currently only 1 scenario name is supported but depending on
-# the need, it can be expanded, supporting multiple scenarios
-# using comma separated list or something
-SCENARIO_NAME_PATTERN="(?<=@scenario:).*?(?=@)"
-SCENARIO_NAME=(echo $GERRIT_CHANGE_COMMIT_MESSAGE | grep -oP "$SCENARIO_NAME_PATTERN")
-if [[ $? -ne 0 ]]; then
-    echo "The patch verification will be done only with build!"
-else
-    echo "Will run full verification; build, deploy, and smoke test using scenario $SCENARIO_NAME"
-fi
diff --git a/jjb/fuel/fuel-build-exp.sh b/jjb/fuel/fuel-build-exp.sh
deleted file mode 100755 (executable)
index f7f613d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-if [[ "$JOB_NAME" =~ (verify|merge|daily|weekly) ]]; then
-    JOB_TYPE=${BASH_REMATCH[0]}
-else
-    echo "Unable to determine job type!"
-    exit 1
-fi
-
-echo "Not activated!"
index 2378552..19336d8 100644 (file)
             use-build-blocker: true
             blocking-jobs:
                 - 'fuel-os-.*?-{pod}-daily-.*'
+                - 'fuel-os-.*?-{pod}-weekly-.*'
             block-level: 'NODE'
 
     wrappers:
 
     builders:
         - description-setter:
-            description: "POD: $NODE_NAME"
+            description: "Built on $NODE_NAME"
         - trigger-builds:
             - project: 'fuel-deploy-{pod}-daily-{stream}'
               current-parameters: false
             blocking-jobs:
                 - 'fuel-deploy-{pod}-daily-.*'
                 - 'fuel-deploy-generic-daily-.*'
+                - 'fuel-deploy-{pod}-weekly-.*'
+                - 'fuel-deploy-generic-weekly-.*'
             block-level: 'NODE'
 
     parameters:
 
     builders:
         - description-setter:
-            description: "POD: $NODE_NAME"
+            description: "Built on $NODE_NAME"
         - shell:
             !include-raw-escape: ./fuel-download-artifact.sh
         - shell:
diff --git a/jjb/fuel/fuel-deploy-exp.sh b/jjb/fuel/fuel-deploy-exp.sh
deleted file mode 100755 (executable)
index f7f613d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-if [[ "$JOB_NAME" =~ (verify|merge|daily|weekly) ]]; then
-    JOB_TYPE=${BASH_REMATCH[0]}
-else
-    echo "Unable to determine job type!"
-    exit 1
-fi
-
-echo "Not activated!"
index 4efccd6..f5bbd18 100755 (executable)
@@ -95,7 +95,7 @@ echo "Deployment is done!"
 
 # upload logs for baremetal deployments
 # work with virtual deployments is still going on so we skip that for the timebeing
-if [[ "$JOB_NAME" =~ "baremetal-daily" ]]; then
+if [[ "$JOB_NAME" =~ (baremetal-daily|baremetal-weekly) ]]; then
     echo "Uploading deployment logs"
     gsutil cp $WORKSPACE/$FUEL_LOG_FILENAME gs://$GS_URL/logs/$FUEL_LOG_FILENAME > /dev/null 2>&1
     echo "Logs are available as http://$GS_URL/logs/$FUEL_LOG_FILENAME"
diff --git a/jjb/fuel/fuel-smoke-test-exp.sh b/jjb/fuel/fuel-smoke-test-exp.sh
deleted file mode 100755 (executable)
index f7f613d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-if [[ "$JOB_NAME" =~ (verify|merge|daily|weekly) ]]; then
-    JOB_TYPE=${BASH_REMATCH[0]}
-else
-    echo "Unable to determine job type!"
-    exit 1
-fi
-
-echo "Not activated!"
diff --git a/jjb/fuel/fuel-verify-jobs-experimental.yml b/jjb/fuel/fuel-verify-jobs-experimental.yml
deleted file mode 100644 (file)
index ae64580..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-- project:
-    # TODO: rename the project name
-    # TODO: get rid of appended -exp from the remainder of the file
-    name: 'fuel-verify-jobs-experimental'
-
-    project: 'fuel'
-
-    installer: 'fuel'
-#------------------------------------
-# branch definitions
-#------------------------------------
-    # TODO: enable master once things settle
-    stream-exp:
-        - experimental:
-            branch: 'stable/{stream-exp}'
-            gs-pathname: '/{stream-exp}'
-            disabled: false
-#------------------------------------
-# patch verification phases
-#------------------------------------
-    phase:
-        - 'basic':
-            # this phase does basic commit message check, unit test and so on
-            slave-label: 'opnfv-build'
-        - 'build':
-            # this phase builds artifacts if valid for given installer
-            slave-label: 'opnfv-build-ubuntu'
-        - 'deploy-virtual':
-            # this phase does virtual deployment using the artifacts produced in previous phase
-            slave-label: 'fuel-virtual'
-        - 'smoke-test':
-            # this phase runs functest smoke test
-            slave-label: 'fuel-virtual'
-#------------------------------------
-# jobs
-#------------------------------------
-    jobs:
-        - 'fuel-verify-{stream-exp}'
-        - 'fuel-verify-{phase}-{stream-exp}'
-#------------------------------------
-# job templates
-#------------------------------------
-- job-template:
-    name: 'fuel-verify-{stream-exp}'
-
-    project-type: multijob
-
-    disabled: '{obj:disabled}'
-
-    # TODO: this is valid for experimental only
-    #       enable concurrency for master once things settle
-    concurrent: false
-
-    properties:
-        - logrotate-default
-        - throttle:
-            enabled: true
-            max-total: 4
-            option: 'project'
-
-    scm:
-        - git-scm-gerrit
-
-    wrappers:
-        - ssh-agent-wrapper
-        - timeout:
-            timeout: 360
-            fail: true
-
-    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}'
-                file-paths:
-                  - compare-type: ANT
-                    pattern: 'ci/**'
-                  - compare-type: ANT
-                    pattern: 'build/**'
-                  - compare-type: ANT
-                    pattern: 'deploy/**'
-                forbidden-file-paths:
-                  - compare-type: ANT
-                    pattern: 'docs/**'
-            readable-message: true
-
-    parameters:
-        - project-parameter:
-            project: '{project}'
-            branch: '{branch}'
-        - 'opnfv-build-defaults'
-        - 'fuel-verify-defaults-exp':
-            gs-pathname: '{gs-pathname}'
-
-    builders:
-        - description-setter:
-            description: "Built on $NODE_NAME"
-        - multijob:
-            name: basic
-            condition: SUCCESSFUL
-            projects:
-                - name: 'fuel-verify-basic-{stream-exp}'
-                  current-parameters: false
-                  predefined-parameters: |
-                    BRANCH=$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
-        - multijob:
-            name: build
-            condition: SUCCESSFUL
-            projects:
-                - name: 'fuel-verify-build-{stream-exp}'
-                  current-parameters: false
-                  predefined-parameters: |
-                    BRANCH=$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
-        - multijob:
-            name: deploy-virtual
-            condition: SUCCESSFUL
-            projects:
-                - name: 'fuel-verify-deploy-virtual-{stream-exp}'
-                  current-parameters: false
-                  predefined-parameters: |
-                    BRANCH=$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
-        - multijob:
-            name: smoke-test
-            condition: SUCCESSFUL
-            projects:
-                - name: 'fuel-verify-smoke-test-{stream-exp}'
-                  current-parameters: false
-                  predefined-parameters: |
-                    BRANCH=$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
-
-- job-template:
-    name: 'fuel-verify-{phase}-{stream-exp}'
-
-    disabled: '{obj:disabled}'
-
-    concurrent: true
-
-    properties:
-        - logrotate-default
-        - throttle:
-            enabled: true
-            max-total: 6
-            option: 'project'
-        - build-blocker:
-            use-build-blocker: true
-            blocking-jobs:
-                - 'fuel-verify-deploy-.*'
-                - 'fuel-verify-test-.*'
-            block-level: 'NODE'
-
-    scm:
-        - git-scm-gerrit
-
-    wrappers:
-        - ssh-agent-wrapper
-        - timeout:
-            timeout: 360
-            fail: true
-    parameters:
-        - project-parameter:
-            project: '{project}'
-            branch: '{branch}'
-        - '{slave-label}-defaults'
-        - '{installer}-defaults'
-        - 'fuel-verify-defaults-exp':
-            gs-pathname: '{gs-pathname}'
-
-    builders:
-        - description-setter:
-            description: "Built on $NODE_NAME"
-        - '{project}-verify-{phase}-macro-exp'
-#------------------------------------
-# builder macros
-#------------------------------------
-- builder:
-    name: 'fuel-verify-basic-macro-exp'
-    builders:
-        - shell:
-            !include-raw: ./fuel-basic-exp.sh
-
-- builder:
-    name: 'fuel-verify-build-macro-exp'
-    builders:
-        - shell:
-            !include-raw: ./fuel-build-exp.sh
-        - shell:
-            !include-raw: ./fuel-workspace-cleanup.sh
-
-- builder:
-    name: 'fuel-verify-deploy-virtual-macro-exp'
-    builders:
-        - shell:
-            !include-raw: ./fuel-deploy-exp.sh
-
-- builder:
-    name: 'fuel-verify-smoke-test-macro-exp'
-    builders:
-        - shell:
-            !include-raw: ./fuel-smoke-test-exp.sh
-#------------------------------------
-# parameter macros
-#------------------------------------
-- parameter:
-    name: 'fuel-verify-defaults-exp'
-    parameters:
-        - string:
-            name: BUILD_DIRECTORY
-            default: $WORKSPACE/build_output
-            description: "Directory where the build artifact will be located upon the completion of the build."
-        - string:
-            name: CACHE_DIRECTORY
-            default: $HOME/opnfv/cache/$INSTALLER_TYPE
-            description: "Directory where the cache to be used during the build is located."
-        - string:
-            name: GS_URL
-            default: artifacts.opnfv.org/$PROJECT{gs-pathname}
-            description: "URL to Google Storage."
diff --git a/jjb/fuel/fuel-weekly-jobs.yml b/jjb/fuel/fuel-weekly-jobs.yml
new file mode 100644 (file)
index 0000000..06d8134
--- /dev/null
@@ -0,0 +1,210 @@
+# jenkins job templates for Fuel
+- project:
+
+    name: fuel-weekly
+
+    project: fuel
+
+    installer: fuel
+
+#--------------------------------
+# BRANCH ANCHORS
+#--------------------------------
+    master: &master
+        stream: master
+        branch: '{stream}'
+        disabled: false
+        gs-pathname: ''
+    danube: &danube
+        stream: danube
+        branch: 'stable/{stream}'
+        disabled: true
+        gs-pathname: '/{stream}'
+#--------------------------------
+# POD, INSTALLER, AND BRANCH MAPPING
+#--------------------------------
+#        CI PODs
+#--------------------------------
+    pod:
+        - baremetal:
+            slave-label: fuel-baremetal
+            <<: *master
+        - virtual:
+            slave-label: fuel-virtual
+            <<: *master
+        - baremetal:
+            slave-label: fuel-baremetal
+            <<: *danube
+        - virtual:
+            slave-label: fuel-virtual
+            <<: *danube
+#--------------------------------
+#       scenarios
+#--------------------------------
+    scenario:
+        # HA scenarios
+        - 'os-nosdn-nofeature-ha':
+            auto-trigger-name: 'weekly-trigger-disabled'
+
+    jobs:
+        - 'fuel-{scenario}-{pod}-weekly-{stream}'
+        - 'fuel-deploy-{pod}-weekly-{stream}'
+
+########################
+# job templates
+########################
+- job-template:
+    name: 'fuel-{scenario}-{pod}-weekly-{stream}'
+
+    disabled: '{obj:disabled}'
+
+    concurrent: false
+
+    properties:
+        - logrotate-default
+        - throttle:
+            enabled: true
+            max-total: 4
+            max-per-node: 1
+            option: 'project'
+        - build-blocker:
+            use-build-blocker: true
+            blocking-jobs:
+                - 'fuel-os-.*?-{pod}-daily-.*'
+                - 'fuel-os-.*?-{pod}-weekly-.*'
+            block-level: 'NODE'
+
+    wrappers:
+        - build-name:
+            name: '$BUILD_NUMBER - Scenario: $DEPLOY_SCENARIO'
+
+    triggers:
+        - '{auto-trigger-name}'
+
+    parameters:
+        - project-parameter:
+            project: '{project}'
+            branch: '{branch}'
+        - '{installer}-defaults'
+        - '{slave-label}-defaults':
+            installer: '{installer}'
+        - string:
+            name: DEPLOY_SCENARIO
+            default: '{scenario}'
+        - fuel-weekly-parameter:
+            gs-pathname: '{gs-pathname}'
+
+    builders:
+        - description-setter:
+            description: "Built on $NODE_NAME"
+        - trigger-builds:
+            - project: 'fuel-deploy-{pod}-weekly-{stream}'
+              current-parameters: false
+              predefined-parameters:
+                DEPLOY_SCENARIO={scenario}
+              same-node: true
+              block: true
+        - trigger-builds:
+            - project: 'functest-fuel-{pod}-weekly-{stream}'
+              current-parameters: false
+              predefined-parameters:
+                DEPLOY_SCENARIO={scenario}
+              same-node: true
+              block: true
+              block-thresholds:
+                build-step-failure-threshold: 'never'
+                failure-threshold: 'never'
+                unstable-threshold: 'FAILURE'
+
+    publishers:
+        - email:
+            recipients: peter.barabas@ericsson.com fzhadaev@mirantis.com
+
+- job-template:
+    name: 'fuel-deploy-{pod}-weekly-{stream}'
+
+    disabled: '{obj:disabled}'
+
+    concurrent: true
+
+    properties:
+        - logrotate-default
+        - throttle:
+            enabled: true
+            max-total: 4
+            max-per-node: 1
+            option: 'project'
+        - build-blocker:
+            use-build-blocker: true
+            blocking-jobs:
+                - 'fuel-deploy-{pod}-daily-.*'
+                - 'fuel-deploy-generic-daily-.*'
+                - 'fuel-deploy-{pod}-weekly-.*'
+                - 'fuel-deploy-generic-weekly-.*'
+            block-level: 'NODE'
+
+    parameters:
+        - project-parameter:
+            project: '{project}'
+            branch: '{branch}'
+        - '{installer}-defaults'
+        - '{slave-label}-defaults':
+            installer: '{installer}'
+        - string:
+            name: DEPLOY_SCENARIO
+            default: 'os-odl_l2-nofeature-ha'
+        - fuel-weekly-parameter:
+            gs-pathname: '{gs-pathname}'
+        - string:
+            name: DEPLOY_TIMEOUT
+            default: '150'
+            description: 'Deployment timeout in minutes'
+
+    scm:
+        - git-scm
+
+    wrappers:
+        - build-name:
+            name: '$BUILD_NUMBER - Scenario: $DEPLOY_SCENARIO'
+
+    builders:
+        - description-setter:
+            description: "Built on $NODE_NAME"
+        - shell:
+            !include-raw-escape: ./fuel-download-artifact.sh
+        - shell:
+            !include-raw-escape: ./fuel-deploy.sh
+
+    publishers:
+        - email:
+            recipients: peter.barabas@ericsson.com fzhadaev@mirantis.com
+
+########################
+# parameter macros
+########################
+- parameter:
+    name: fuel-weekly-parameter
+    parameters:
+        - string:
+            name: BUILD_DIRECTORY
+            default: $WORKSPACE/build_output
+            description: "Directory where the build artifact will be located upon the completion of the build."
+        - string:
+            name: CACHE_DIRECTORY
+            default: $HOME/opnfv/cache/$INSTALLER_TYPE
+            description: "Directory where the cache to be used during the build is located."
+        - string:
+            name: GS_URL
+            default: artifacts.opnfv.org/$PROJECT{gs-pathname}
+            description: "URL to Google Storage."
+########################
+# trigger macros
+########################
+#-----------------------------------------------
+# Triggers for job running on fuel-baremetal against master branch
+#-----------------------------------------------
+# HA Scenarios
+- trigger:
+    name: 'fuel-os-nosdn-nofeature-ha-baremetal-weekly-master-trigger'
+    triggers:
+        - timed: ''
similarity index 93%
rename from jjb/functest/functest-ci-jobs.yml
rename to jjb/functest/functest-daily-jobs.yml
index 9bf6a1a..5984b36 100644 (file)
@@ -2,9 +2,9 @@
 # job configuration for functest
 ###################################
 - project:
-    name: functest
+    name: functest-daily
 
-    project: '{name}'
+    project: functest
 
 #--------------------------------
 # BRANCH ANCHORS
             installer: fuel
             <<: *danube
 # daisy CI PODs
-        - daisy-baremetal:
+        - baremetal:
             slave-label: daisy-baremetal
             installer: daisy
             <<: *master
-        - daisy-virtual:
+        - virtual:
             slave-label: daisy-virtual
             installer: daisy
             <<: *master
             job-timeout: 60
         - 'daily':
             job-timeout: 180
-        - 'weekly':
-            job-timeout: 400
 
     jobs:
         - 'functest-{installer}-{pod}-{testsuite}-{stream}'
 
     builders:
         - description-setter:
-            description: "POD: $NODE_NAME"
+            description: "Built on $NODE_NAME"
         - 'functest-{testsuite}-builder'
 
 ########################
             name: FUNCTEST_SUITE_NAME
             default: 'daily'
             description: "Daily suite name to run"
-- parameter:
-    name: functest-weekly-parameter
-    parameters:
-        - string:
-            name: FUNCTEST_SUITE_NAME
-            default: 'weekly'
-            description: "Weekly suite name to run"
 - parameter:
     name: functest-suite-parameter
     parameters:
         - 'functest-store-results'
         - 'functest-exit'
 
-- builder:
-    name: functest-weekly-builder
-    builders:
-        - 'functest-cleanup'
-        - 'set-functest-env'
-        - 'functest-weekly'
-        - 'functest-store-results'
-        - 'functest-exit'
-
 - builder:
     name: functest-suite-builder
     builders:
         - shell:
             !include-raw: ./functest-loop.sh
 
-- builder:
-    name: functest-weekly
-    builders:
-        - shell:
-            !include-raw: ./functest-loop.sh
 
 - builder:
     name: functest-suite
diff --git a/jjb/functest/functest-weekly-jobs.yml b/jjb/functest/functest-weekly-jobs.yml
new file mode 100644 (file)
index 0000000..f44f7b8
--- /dev/null
@@ -0,0 +1,124 @@
+###################################
+# job configuration for functest
+###################################
+- project:
+    name: functest-weekly
+
+    project: functest
+
+#--------------------------------
+# BRANCH ANCHORS
+#--------------------------------
+    master: &master
+        stream: master
+        branch: '{stream}'
+        gs-pathname: ''
+        docker-tag: 'latest'
+        disabled: false
+    danube: &danube
+        stream: danube
+        branch: 'stable/{stream}'
+        gs-pathname: '/{stream}'
+        docker-tag: 'stable'
+        disabled: true
+#--------------------------------
+# POD, INSTALLER, AND BRANCH MAPPING
+#--------------------------------
+#    Installers using labels
+#            CI PODs
+# This section should only contain the installers
+# that have been switched using labels for slaves
+#--------------------------------
+    pod:
+# fuel CI PODs
+        - baremetal:
+            slave-label: fuel-baremetal
+            installer: fuel
+            <<: *master
+        - virtual:
+            slave-label: fuel-virtual
+            installer: fuel
+            <<: *master
+        - baremetal:
+            slave-label: fuel-baremetal
+            installer: fuel
+            <<: *danube
+        - virtual:
+            slave-label: fuel-virtual
+            installer: fuel
+            <<: *danube
+#--------------------------------
+    jobs:
+        - 'functest-{installer}-{pod}-weekly-{stream}'
+
+################################
+# job template
+################################
+- job-template:
+    name: 'functest-{installer}-{pod}-weekly-{stream}'
+
+    disabled: '{obj:disabled}'
+
+    concurrent: true
+
+    properties:
+        - logrotate-default
+        - throttle:
+            enabled: true
+            max-per-node: 1
+            option: 'project'
+
+    wrappers:
+        - build-name:
+            name: '$BUILD_NUMBER Suite: $FUNCTEST_SUITE_NAME Scenario: $DEPLOY_SCENARIO'
+        - timeout:
+            timeout: '400'
+            abort: true
+
+    parameters:
+        - project-parameter:
+            project: '{project}'
+            branch: '{branch}'
+        - '{installer}-defaults'
+        - '{slave-label}-defaults'
+        - string:
+            name: FUNCTEST_SUITE_NAME
+            default: 'weekly'
+            description: "Weekly suite name to run"
+        - string:
+            name: DEPLOY_SCENARIO
+            default: 'os-odl_l2-nofeature-ha'
+        - string:
+            name: DOCKER_TAG
+            default: '{docker-tag}'
+            description: 'Tag to pull docker image'
+        - string:
+            name: CLEAN_DOCKER_IMAGES
+            default: 'false'
+            description: 'Remove downloaded docker images (opnfv/functest*:*)'
+        - functest-parameter:
+            gs-pathname: '{gs-pathname}'
+
+    scm:
+        - git-scm
+
+    builders:
+        - description-setter:
+            description: "Built on $NODE_NAME"
+        - 'functest-weekly-builder'
+########################
+# builder macros
+########################
+- builder:
+    name: functest-weekly-builder
+    builders:
+        - shell:
+            !include-raw: ./functest-cleanup.sh
+        - shell:
+            !include-raw: ./set-functest-env.sh
+        - shell:
+            !include-raw: ./functest-loop.sh
+        - shell:
+            !include-raw: ../../utils/push-test-logs.sh
+        - shell:
+            !include-raw: ./functest-exit.sh
index 34f53fb..63613f8 100644 (file)
                   - compare-type: 'ANT'
                     pattern: '{files}'
             skip-vote:
-                successful: true
-                failed: true
-                unstable: true
-                notbuilt: true
+                successful: false
+                failed: false
+                unstable: false
+                notbuilt: false
 
 - trigger:
     name: gerrit-trigger-change-merged
                 branches:
                   - branch-compare-type: 'ANT'
                     branch-pattern: '**/{branch}'
+                file-paths:
+                  - compare-type: 'ANT'
+                    pattern: '{files}'
 
 - trigger:
     name: 'experimental'
index 0ee906f..f1b38ca 100644 (file)
                 file-paths:
                   - compare-type: ANT
                     pattern: 'prototypes/bifrost/**'
-                  - compare-type: ANT
-                    pattern: 'jjb/infra/**'
             readable-message: true
index d8b4051..0661761 100755 (executable)
@@ -27,6 +27,9 @@ if [[ -z "FUEL_PROPERTIES_FILE" ]]; then
     echo "Unable to extract the url to Fuel ISO properties from ${FUEL_DEPLOY_URL}"
     exit 1
 fi
+
+# use known/working version of fuel
+FUEL_PROPERTIES_FILE="opnfv-2017-03-06_16-00-15.properties"
 curl -L -s -o $WORKSPACE/latest.properties http://artifacts.opnfv.org/fuel/$FUEL_PROPERTIES_FILE
 
 # source the file so we get OPNFV vars
index d49caf1..5d2cc03 100644 (file)
@@ -83,7 +83,7 @@
                 - name: 'compass-deploy-virtual-daily-{stream}'
                   current-parameters: false
                   predefined-parameters: |
-                    DEPLOY_SCENARIO=os-nosdn-openo-noha
+                    DEPLOY_SCENARIO=os-nosdn-openo-ha
                     COMPASS_OS_VERSION=xenial
                   node-parameters: true
                   kill-phase-on: FAILURE
index 2d5ec4f..c78e7f0 100644 (file)
         - git-scm
 
     triggers:
-        - gerrit-trigger-change-merged
+        - gerrit-trigger-change-merged:
+            project: '**'
+            branch: '{branch}'
+            files: 'docs/**/*.*'
 
     builders:
         - shell: !include-raw: docs-post-rtd.sh
index 1295033..661f060 100644 (file)
                 branches:
                   - branch-compare-type: 'ANT'
                     branch-pattern: '**/{branch}'
+            skip-vote:
+                successful: true
+                failed: true
+                unstable: true
+                notbuilt: true
 
     builders:
         - check-bash-syntax
index 69fcefc..7f3d6ce 100644 (file)
                     branch-pattern: '**/{branch}'
                 forbidden-file-paths:
                   - compare-type: ANT
-                    pattern: 'docs/**|.gitignore'
+                    pattern: 'docs/**'
+                  - compare-type: ANT
+                    pattern: 'governance/**'
+                  - compare-type: ANT
+                    pattern: '*.txt|.gitignore|.gitreview|INFO|LICENSE'
 
     builders:
         - shell: |
index 98f7ab9..10ee72a 100644 (file)
         - gerrit-trigger-change-merged:
             project: '{project}'
             branch: '{branch}'
+            files: '**'
index 37cdef2..166aea8 100644 (file)
                     comment-contains-value: 'reverify'
             projects:
               - project-compare-type: 'REG_EXP'
-                project-pattern: 'compass4nfv'
+                project-pattern: ''
                 branches:
                   - branch-compare-type: 'ANT'
                     branch-pattern: '**/{branch}'
diff --git a/jjb/snaps/snaps.yml b/jjb/snaps/snaps.yml
new file mode 100644 (file)
index 0000000..32680f5
--- /dev/null
@@ -0,0 +1,62 @@
+###################################################
+# All the jobs except verify have been removed!
+# They will only be enabled on request by projects!
+###################################################
+- project:
+    name: snaps
+
+    project: '{name}'
+
+    jobs:
+        - 'snaps-verify-{stream}'
+
+    stream:
+        - master:
+            branch: '{stream}'
+            gs-pathname: ''
+            disabled: false
+        - danube:
+            branch: 'stable/{stream}'
+            gs-pathname: '/{stream}'
+            disabled: true
+
+- job-template:
+    name: 'snaps-verify-{stream}'
+
+    disabled: '{obj:disabled}'
+
+    parameters:
+        - project-parameter:
+            project: '{project}'
+            branch: '{branch}'
+        - '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}'
+                forbidden-file-paths:
+                  - compare-type: ANT
+                    pattern: 'docs/**|.gitignore'
+
+    builders:
+        - shell: |
+            echo "Nothing to verify!"
index a71d6cb..a217767 100644 (file)
@@ -176,7 +176,7 @@ class FuelAdapter(manager.DeploymentHandler):
         return version
 
     def get_sdn_version(self):
-        cmd = "apt-cache show opendaylight|grep Version"
+        cmd = "apt-cache policy opendaylight|grep Installed"
         version = None
         for node in self.nodes:
             if manager.Role.ODL in node.roles and node.is_active():
index 137c050..ae1fd20 100644 (file)
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
+import requests
+
 from tornado.web import RequestHandler
 from tornado.escape import json_encode
+from tornado.escape import json_decode
 
 
-class FiltersHandler(RequestHandler):
-    def get(self):
-        return self.write(json_encode({'status': 'SUCCESS'}))
+class BaseHandler(RequestHandler):
+    def _set_header(self):
+        self.set_header('Access-Control-Allow-Origin', '*')
+        self.set_header('Access-Control-Allow-Headers',
+                        'Content-Type, Content-Length, Authorization, \
+                        Accept, X-Requested-With , PRIVATE-TOKEN')
+        self.set_header('Access-Control-Allow-Methods',
+                        'PUT, POST, GET, DELETE, OPTIONS')
 
 
-class ScenariosHandler(RequestHandler):
+class FiltersHandler(BaseHandler):
     def get(self):
-        return self.write(json_encode({'status': 'SUCCESS'}))
+        self._set_header()
+
+        filters = {
+            'filters': {
+                'status': ['success', 'warning', 'danger'],
+                'projects': ['functest', 'yardstick'],
+                'installers': ['apex', 'compass', 'fuel', 'joid'],
+                'version': ['colorado', 'master'],
+                'loops': ['daily', 'weekly', 'monthly'],
+                'time': ['10 days', '30 days']
+            }
+        }
+        return self.write(json_encode(filters))
+
+
+class ScenariosHandler(BaseHandler):
+    def post(self):
+        self._set_header()
+
+        body = json_decode(self.request.body)
+        args = self._get_args(body)
+
+        scenarios = self._get_result_data(self._get_scenarios(), args)
+
+        return self.write(json_encode(dict(scenarios=scenarios)))
+
+    def _get_result_data(self, data, args):
+        data = self._filter_status(data, args)
+        return {s: self._get_scenario_result(s, data[s], args) for s in data}
+
+    def _filter_status(self, data, args):
+        return {k: v for k, v in data.items() if v['status'] in args['status']}
+
+    def _get_scenario_result(self, scenario, data, args):
+        result = {
+            'status': data.get('status'),
+            'installers': self._get_installers_result(data['installers'], args)
+        }
+        return result
+
+    def _get_installers_result(self, data, args):
+        func = self._get_installer_result
+        return {k: func(k, data.get(k, {}), args) for k in args['installers']}
+
+    def _get_installer_result(self, installer, data, args):
+        projects = data.get(args['version'], [])
+        return [self._get_project_data(projects, p) for p in args['projects']]
+
+    def _get_project_data(self, projects, project):
+        atom = {
+            'project': project,
+            'score': None,
+            'status': None
+        }
+        for p in projects:
+            if p['project'] == project:
+                return p
+        return atom
+
+    def _get_scenarios(self):
+        url = 'http://testresults.opnfv.org/test/api/v1/scenarios'
+        resp = requests.get(url).json()
+        data = self._change_to_utf8(resp).get('scenarios', {})
+        return {a.get('name'): self._get_scenario(a.get('installers', [])
+                                                  ) for a in data}
+
+    def _get_scenario(self, data):
+        installers = {a.get('installer'): self._get_installer(a.get('versions',
+                                                                    [])
+                                                              ) for a in data}
+        scenario = {
+            'status': self._get_status(),
+            'installers': installers
+        }
+        return scenario
+
+    def _get_status(self):
+        return 'success'
+
+    def _get_installer(self, data):
+        return {a.get('version'): self._get_version(a) for a in data}
+
+    def _get_version(self, data):
+        try:
+            scores = data.get('score', {}).get('projects')[0]
+            trusts = data.get('trust_indicator', {}).get('projects')[0]
+        except (TypeError, IndexError):
+            return []
+        else:
+            scores = {key: [dict(date=a.get('date')[:10],
+                                 score=a.get('score')
+                                 ) for a in scores[key]] for key in scores}
+            trusts = {key: [dict(date=a.get('date')[:10],
+                                 status=a.get('status')
+                                 ) for a in trusts[key]] for key in trusts}
+            atom = self._get_atom(scores, trusts)
+            return [dict(project=k,
+                         score=sorted(atom[k], reverse=True)[0].get('score'),
+                         status=sorted(atom[k], reverse=True)[0].get('status')
+                         ) for k in atom if atom[k]]
+
+    def _get_atom(self, scores, trusts):
+        s = {k: {a['date']: a['score'] for a in scores[k]} for k in scores}
+        t = {k: {a['date']: a['status'] for a in trusts[k]} for k in trusts}
+        return {k: [dict(score=s[k][a], status=t[k][a], data=a
+                         ) for a in s[k] if a in t[k]] for k in s}
+
+    def _change_to_utf8(self, obj):
+        if isinstance(obj, dict):
+            return {str(k): self._change_to_utf8(v) for k, v in obj.items()}
+        elif isinstance(obj, list):
+            return [self._change_to_utf8(ele) for ele in obj]
+        else:
+            try:
+                new = eval(obj)
+                if isinstance(new, int):
+                    return obj
+                return self._change_to_utf8(new)
+            except (NameError, TypeError, SyntaxError):
+                return str(obj)
+
+    def _get_args(self, body):
+        status = self._get_status_args(body)
+        projects = self._get_projects_args(body)
+        installers = self._get_installers_args(body)
+
+        args = {
+            'status': status,
+            'projects': projects,
+            'installers': installers,
+            'version': body.get('version', 'master').lower(),
+            'loops': body.get('loops', 'daily').lower(),
+            'time': body.get('times', '10 days')[:2].lower()
+        }
+        return args
+
+    def _get_status_args(self, body):
+        status_all = ['success', 'warning', 'danger']
+        status = [a.lower() for a in body.get('status', ['all'])]
+        return status_all if 'all' in status else status
+
+    def _get_projects_args(self, body):
+        project_all = ['functest', 'yardstick']
+        projects = [a.lower() for a in body.get('projects', ['all'])]
+        return project_all if 'all' in projects else projects
+
+    def _get_installers_args(self, body):
+        installer_all = ['apex', 'compass', 'fuel', 'joid']
+        installers = [a.lower() for a in body.get('installers', ['all'])]
+        return installer_all if 'all' in installers else installers
diff --git a/utils/test/reporting/api/install.sh b/utils/test/reporting/api/install.sh
new file mode 100755 (executable)
index 0000000..55d6b77
--- /dev/null
@@ -0,0 +1,3 @@
+apt-get install -y python-pip
+pip install tornado
+pip install requests
index 78bcc4e..1de13ae 100755 (executable)
@@ -79,10 +79,4 @@ echo "daemon off;" >> /etc/nginx/nginx.conf
 # supervisor config
 cp /home/opnfv/utils/test/reporting/docker/supervisor.conf /etc/supervisor/conf.d/
 
-# build pages
-cd pages
 ln -s /usr/bin/nodejs /usr/bin/node
-npm install
-npm install -g grunt bower
-bower install --allow-root
-grunt build
index 0c22077..1e0eed9 100644 (file)
@@ -14,3 +14,9 @@ autorestart = true
 user = root
 command = service nginx restart
 autorestart = true
+
+[program:reporting_angular]
+user = root
+directory = /home/opnfv/utils/test/reporting/pages
+command = bash angular.sh
+autorestart = true
diff --git a/utils/test/reporting/pages/angular.sh b/utils/test/reporting/pages/angular.sh
new file mode 100755 (executable)
index 0000000..a7f1675
--- /dev/null
@@ -0,0 +1,10 @@
+: ${SERVER_URL:='http://testresults.opnfv.org/reporting/api'}
+
+echo "var BASE_URL = 'http://${SERVER_URL}/landing-page'" > app/scripts/app.config.js
+
+apt-get install -y nodejs
+apt-get install -y npm
+npm install
+npm install -g grunt bower
+bower install --allow-root
+grunt build
diff --git a/utils/test/reporting/pages/app/images/green.png b/utils/test/reporting/pages/app/images/green.png
new file mode 100644 (file)
index 0000000..57fc599
Binary files /dev/null and b/utils/test/reporting/pages/app/images/green.png differ
diff --git a/utils/test/reporting/pages/app/images/green@2x.png b/utils/test/reporting/pages/app/images/green@2x.png
new file mode 100644 (file)
index 0000000..3bda5be
Binary files /dev/null and b/utils/test/reporting/pages/app/images/green@2x.png differ
index 7673a4c..1159c21 100644 (file)
@@ -1,6 +1,7 @@
 <!doctype html>
 <html ng-app="opnfvApp">
-  <head>
+
+<head>
     <meta charset="utf-8">
     <title>OPNFV-DASHBOARD EXAMPLE</title>
     <meta name="description" content="">
     <link rel="stylesheet" href="bower_components/chosen/chosen.css" />
     <link rel="stylesheet" href="bower_components/selectize/dist/css/selectize.css" />
     <link rel="stylesheet" href="bower_components/components-font-awesome/css/font-awesome.css" />
+    <link rel="stylesheet" href="bower_components/angular-tooltips/dist/angular-tooltips.min.css" />
+    <link rel="stylesheet" href="bower_components/animate.css/animate.css" />
+    <link rel="stylesheet" href="bower_components/ng-dialog/css/ngDialog.css" />
+    <link rel="stylesheet" href="bower_components/ng-dialog/css/ngDialog-theme-default.css" />
+    <link rel="stylesheet" href="bower_components/inspiniacss/style.css" />
     <!-- endbower -->
     <!-- endbuild -->
     <!-- build:css(.tmp) styles/style.css -->
-    <!--<link rel="stylesheet" href="styles/main.css">-->
-    <link rel="stylesheet" href="styles/animate.css">
-    <link rel="stylesheet" href="styles/style.css">
+
     <link rel="stylesheet" href="styles/custome.css">
 
+
     <!-- endbuild -->
-  </head>
-  <body class="{{$state.current.data.specialClass}}" id="page-top">
+</head>
+
+<body class="{{$state.current.data.specialClass}}" id="page-top">
     <!--[if lte IE 8]>
       <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
     <![endif]-->
@@ -31,7 +37,7 @@
     <!-- Add your site or application content here -->
     <div ui-view></div>
     <!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
-     <!--<script>
+    <!--<script>
        !function(A,n,g,u,l,a,r){A.GoogleAnalyticsObject=l,A[l]=A[l]||function(){
        (A[l].q=A[l].q||[]).push(arguments)},A[l].l=+new Date,a=n.createElement(g),
        r=n.getElementsByTagName(g)[0],a.src=u,r.parentNode.insertBefore(a,r)
     <script src="bower_components/microplugin/src/microplugin.js"></script>
     <script src="bower_components/selectize/dist/js/selectize.js"></script>
     <script src="bower_components/angular-selectize2/dist/angular-selectize.js"></script>
+    <script src="bower_components/angular-tooltips/dist/angular-tooltips.min.js"></script>
+    <script src="bower_components/jQuery-rwdImageMaps/jquery.rwdImageMaps.min.js"></script>
+    <script src="bower_components/ng-dialog/js/ngDialog.js"></script>
     <!-- endbower -->
     <!-- endbuild -->
 
-        <!-- build:js({.tmp,app}) scripts/scripts.js -->
-        <script src="scripts/app.js"></script>
-        <!--<script src="scripts/controllers/main.js"></script>-->
-        <script src="scripts/config.router.js"></script>
-        <script src="scripts/controllers/table.controller.js"></script>
-        <script src="scripts/config.js"></script>
-        <script src="scripts/directives/mydirective.js"></script>
-        <script src="scripts/factory/table.factory.js"></script>
-        <!-- endbuild -->
+    <!-- build:js({.tmp,app}) scripts/scripts.js -->
+    <script src="scripts/app.js"></script>
+    <!--<script src="scripts/controllers/main.js"></script>-->
+    <script src="scripts/config.router.js"></script>
+    <script src="scripts/controllers/table.controller.js"></script>
+    <script src="scripts/config.js"></script>
+    <script src="scripts/factory/table.factory.js"></script>
+    <script src="scripts/controllers/case.controller.js"></script>
+    <script src="scripts/controllers/auth.controller.js"></script>
+    <script src="scripts/controllers/admin.controller.js"></script>
+    <script src="scripts/controllers/main.controller.js"></script>
+    <script src="scripts/app.config.js"></script>
+    <script src="scripts/controllers/testvisual.controller.js"></script>
+
+    <!-- endbuild -->
 </body>
-</html>
+
+</html>
\ No newline at end of file
diff --git a/utils/test/reporting/pages/app/scripts/app.config.js b/utils/test/reporting/pages/app/scripts/app.config.js
new file mode 100644 (file)
index 0000000..e69de29
index 6e99ce3..d06019c 100644 (file)
@@ -9,12 +9,13 @@
  * Main module of the application.
  */
 angular
-  .module('opnfvApp', [
-    'ngAnimate',
-    'ui.router',
-    'oc.lazyLoad',
-    'ui.bootstrap',
-    'ngResource',
-    'selectize'
+    .module('opnfvApp', [
+        'ngAnimate',
+        'ui.router',
+        'oc.lazyLoad',
+        'ui.bootstrap',
+        'ngResource',
+        'selectize',
+        '720kb.tooltips'
 
-  ]);
+    ]);
\ No newline at end of file
index 838460a..1010169 100644 (file)
@@ -7,8 +7,13 @@
  * Main config file of the application.
  */
 angular
-    .module('opnfvApp').config(function () {
+    .module('opnfvApp').config(['$httpProvider', '$qProvider', function($httpProvider, $qProvider) {
 
-    }
+            $httpProvider.defaults.useXDomain = true;
+            delete $httpProvider.defaults.headers.common['X-Requested-With'];
 
-    )
+            $qProvider.errorOnUnhandledRejections(false);
+
+        }
+
+    ]);
\ No newline at end of file
index 641ea6a..d38ad75 100644 (file)
@@ -23,7 +23,7 @@ angular.module('opnfvApp')
             $stateProvider
                 .state('landingpage', {
                     url: "/landingpage",
-                    //controller: 'MainCtrl',
+                    controller: 'MainController',
                     templateUrl: "views/main.html",
                     data: { pageTitle: '首页', specialClass: 'landing-page' },
                     resolve: {
diff --git a/utils/test/reporting/pages/app/scripts/controllers/main.controller.js b/utils/test/reporting/pages/app/scripts/controllers/main.controller.js
new file mode 100644 (file)
index 0000000..2054dc2
--- /dev/null
@@ -0,0 +1,32 @@
+'use strict';
+
+/**
+ * @ngdoc function
+ * @name opnfvdashBoardAngularApp.controller:MainPageController
+ * @description
+ * # TableController
+ * Controller of the opnfvdashBoardAngularApp
+ */
+angular.module('opnfvApp')
+    .controller('MainController', ['$scope', '$state', '$stateParams', function($scope, $state, $stateParams) {
+
+        init();
+
+        function init() {
+            $scope.goTest = goTest;
+            $scope.goLogin = goLogin;
+
+        }
+
+        function goTest() {
+            $state.go("select.selectTestCase");
+        }
+
+        function goLogin() {
+            $state.go("login");
+        }
+
+
+
+
+    }]);
\ No newline at end of file
index 8ca1e47..0f3a17a 100644 (file)
  * Controller of the opnfvdashBoardAngularApp
  */
 angular.module('opnfvApp')
-    .controller('TableController', ['$scope', '$state', '$stateParams', 'TableFactory', function ($scope, $state, $stateParams, TableFactory) {
+    .controller('TableController', ['$scope', '$state', '$stateParams', '$http', 'TableFactory', function($scope, $state, $stateParams, $http, TableFactory) {
 
         $scope.filterlist = [];
         $scope.selection = [];
-        $scope.statusList = ["Success", "Warning", "Danger"];
-        $scope.projectList = ["Deployment", "Functest", "Yardstick"];
-        $scope.installerList = ["apex", "compass", "fuel", "joid"];
-        $scope.versionlist = ["Colorado", "Master"];
-        $scope.loopci = ["Daily", "Weekly", "Monthly"];
-        $scope.time = ["10 days", "1 Month"];
+        $scope.statusList = [];
+        $scope.projectList = [];
+        $scope.installerList = [];
+        $scope.versionlist = [];
+        $scope.loopci = [];
+        $scope.time = [];
         $scope.tableDataAll = {};
         $scope.tableInfoAll = {};
+        $scope.scenario = {};
 
+        $scope.VersionConfig = {
+            create: true,
+            valueField: 'title',
+            labelField: 'title',
+            delimiter: '|',
+            maxItems: 1,
+            placeholder: 'Version',
+            onChange: function(value) {
+                checkElementArrayValue($scope.selection, $scope.VersionOption);
+                $scope.selection.push(value);
+                // console.log($scope.selection);
+                getScenarioData();
 
+            }
+        }
 
-        $scope.scenario =
-            {
-                "scenarios": {
-                    "os-nosdn-kvm-noha": {
-                        "status": "Success",
-                        "installers": {
-                            "apex": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS",
-
-
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "null",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "compass": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "fuel": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "joid": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ]
-                        }
-                    },
-                    "os-nosdn-ovs-ha": {
-                        "status": "Danger",
-                        "installers": {
-                            "apex": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS",
-
-
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "compass": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "fuel": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "joid": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ]
-                        }
-                    },
-                    "os-nosdn-ovs-noha": {
-                        "status": "Warning",
-                        "installers": {
-                            "apex": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS",
-
-
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "compass": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "fuel": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ],
-                            "joid": [
-                                {
-                                    "project": "Deployment",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Functest",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                },
-                                {
-                                    "project": "Yardstick",
-                                    "score": "13/14",
-                                    "status": "SUCCESS"
-                                }
-                            ]
-                        }
-                    }
+        $scope.LoopConfig = {
+            create: true,
+            valueField: 'title',
+            labelField: 'title',
+            delimiter: '|',
+            maxItems: 1,
+            placeholder: 'Loop',
+            onChange: function(value) {
+                checkElementArrayValue($scope.selection, $scope.LoopOption);
+                $scope.selection.push(value);
+                // console.log($scope.selection);
+                getScenarioData();
+
+            }
+        }
+
+        $scope.TimeConfig = {
+            create: true,
+            valueField: 'title',
+            labelField: 'title',
+            delimiter: '|',
+            maxItems: 1,
+            placeholder: 'Time',
+            onChange: function(value) {
+                checkElementArrayValue($scope.selection, $scope.TimeOption);
+                $scope.selection.push(value);
+                // console.log($scope.selection)
+                getScenarioData();
+
+
+            }
+        }
+
+
+        init();
+
+        function init() {
+            $scope.toggleSelection = toggleSelection;
+            getScenarioData();
+            // radioSetting();
+            getFilters();
+        }
+
+        function getFilters() {
+            TableFactory.getFilter().get({
+
+
+            }).$promise.then(function(response) {
+                if (response != null) {
+                    $scope.statusList = response.filters.status;
+                    $scope.projectList = response.filters.projects;
+                    $scope.installerList = response.filters.installers;
+                    $scope.versionlist = response.filters.version;
+                    $scope.loopci = response.filters.loops;
+                    $scope.time = response.filters.time;
+
+                    $scope.statusListString = $scope.statusList.toString();
+                    $scope.projectListString = $scope.projectList.toString();
+                    $scope.installerListString = $scope.installerList.toString();
+                    $scope.VersionSelected = $scope.versionlist[1];
+                    $scope.LoopCiSelected = $scope.loopci[0];
+                    $scope.TimeSelected = $scope.time[0];
+                    radioSetting($scope.versionlist, $scope.loopci, $scope.time);
+
+                } else {
+                    alert("网络错误");
                 }
+            })
+        }
+
+        function getScenarioData() {
+
+            var utl = BASE_URL + '/scenarios';
+            var data = {
+                'status': ['success', 'danger', 'warning'],
+                'projects': ['functest', 'yardstick'],
+                'installers': ['apex', 'compass', 'fuel', 'joid'],
+                'version': $scope.VersionSelected,
+                'loops': $scope.LoopCiSelected,
+                'time': $scope.TimeSelected
             };
+            var config = {
+                headers: {
+                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
+                }
+            }
+            $http.post(utl, data, config).then(function(response) {
+                if (response.status == 200) {
+                    $scope.scenario = response.data;
+                    constructJson();
+                }
+            })
+        }
 
-        // var headData = Object.keys($scope.scenario.scenarios.os_nosdn_kvm_noha.installers);
-        // $scope.headData = headData;
-        //construct json
+        //construct json 
         function constructJson() {
 
             var colspan;
@@ -267,19 +143,22 @@ angular.module('opnfvApp')
 
             for (var item in $scope.scenario.scenarios) {
 
-
-
-
-                var headData = Object.keys($scope.scenario.scenarios[item].installers);
+                var headData = Object.keys($scope.scenario.scenarios[item].installers).sort();
                 var scenarioStatus = $scope.scenario.scenarios[item].status;
-
+                var scenarioStatusDisplay;
+                if (scenarioStatus == "success") {
+                    scenarioStatusDisplay = "navy";
+                } else if (scenarioStatus == "danger") {
+                    scenarioStatusDisplay = "danger";
+                } else if (scenarioStatus == "warning") {
+                    scenarioStatusDisplay = "warning";
+                }
 
                 InstallerData = headData;
                 var projectData = [];
                 var datadisplay = [];
                 var projects = [];
 
-
                 for (var j = 0; j < headData.length; j++) {
 
                     projectData.push($scope.scenario.scenarios[item].installers[headData[j]]);
@@ -289,9 +168,30 @@ angular.module('opnfvApp')
                     for (var k = 0; k < projectData[j].length; k++) {
                         projects.push(projectData[j][k].project);
                         var temArray = [];
-                        temArray.push(projectData[j][k].score);
-                        temArray.push(projectData[j][k].project);
-                        temArray.push(headData[j]);
+                        if (projectData[j][k].score == null) {
+                            temArray.push("null");
+                            temArray.push(projectData[j][k].project);
+                            temArray.push(headData[j]);
+                        } else {
+                            temArray.push(projectData[j][k].score);
+                            temArray.push(projectData[j][k].project);
+                            temArray.push(headData[j]);
+                        }
+
+
+                        if (projectData[j][k].status == "platinium") {
+                            temArray.push("primary");
+                            temArray.push("P");
+                        } else if (projectData[j][k].status == "gold") {
+                            temArray.push("danger");
+                            temArray.push("G");
+                        } else if (projectData[j][k].status == "silver") {
+                            temArray.push("warning");
+                            temArray.push("S");
+                        } else if (projectData[j][k].status == null) {
+                            temArray.push("null");
+                        }
+
                         datadisplay.push(temArray);
 
                     }
@@ -301,13 +201,21 @@ angular.module('opnfvApp')
                 colspan = projects.length / headData.length;
 
                 var tabledata = {
-                    scenarioName: item, Installer: InstallerData, projectData: projectData, projects: projects,
-                    datadisplay: datadisplay, colspan: colspan, status: scenarioStatus
+                    scenarioName: item,
+                    Installer: InstallerData,
+                    projectData: projectData,
+                    projects: projects,
+                    datadisplay: datadisplay,
+                    colspan: colspan,
+                    status: scenarioStatus,
+                    statusDisplay: scenarioStatusDisplay
                 };
 
                 JSON.stringify(tabledata);
                 $scope.tableDataAll.scenario.push(tabledata);
 
+                // console.log(tabledata);
+
             }
 
 
@@ -315,15 +223,13 @@ angular.module('opnfvApp')
 
             var tempHeadData = [];
 
-
-
             for (var i = 0; i < InstallerData.length; i++) {
                 for (var j = 0; j < colspan; j++) {
                     tempHeadData.push(InstallerData[i]);
                 }
             }
 
-            console.log(tempHeadData);
+            //console.log(tempHeadData);
 
             var projectsInfoAll = [];
 
@@ -334,13 +240,14 @@ angular.module('opnfvApp')
                 projectsInfoAll.push(tempA);
 
             }
-            console.log(projectsInfoAll);
+            //console.log(projectsInfoAll);
 
             $scope.tableDataAll["colspan"] = colspan;
             $scope.tableDataAll["Installer"] = InstallerData;
             $scope.tableDataAll["Projects"] = projectsInfoAll;
 
-            console.log($scope.tableDataAll);
+            // console.log($scope.tableDataAll);
+            $scope.colspan = $scope.tableDataAll.colspan;
 
         }
 
@@ -353,58 +260,11 @@ angular.module('opnfvApp')
             return size;
         }
 
-        init();
-        function init() {
-            $scope.toggleSelection = toggleSelection;
-
-            constructJson();
-
-        }
-
-        // $scope.test=false;
+        $scope.colspan = $scope.tableDataAll.colspan;
+        // console.log($scope.colspan);
 
-        var statusListString = $scope.statusList.toString();
-        var projectListString = $scope.projectList.toString();
-        var installerListString = $scope.installerList.toString();
 
-
-        $scope.colspan=$scope.tableDataAll.colspan;
-        //filter function
-        function filterData() {
-
-
-            $scope.selectInstallers = [];
-            $scope.selectProjects = [];
-            $scope.selectStatus = [];
-            for (var i = 0; i < $scope.selection.length; i++) {
-                if (statusListString.indexOf($scope.selection[i]) > -1) {
-                    $scope.selectStatus.push($scope.selection[i]);
-                }
-                if (projectListString.indexOf($scope.selection[i]) > -1) {
-                    $scope.selectProjects.push($scope.selection[i]);
-                }
-                if (installerListString.indexOf($scope.selection[i]) > -1) {
-                    $scope.selectInstallers.push($scope.selection[i]);
-                }
-            }
-
-            $scope.colspan=$scope.selectProjects.length;
-            //when some selection is empty, we set it full
-            if($scope.selectInstallers.length==0){
-                $scope.selectInstallers=$scope.installerList;
-
-            }
-            if($scope.selectProjects.length==0){
-                $scope.selectProjects=$scope.projectList;
-                $scope.colspan=$scope.tableDataAll.colspan;
-            }
-            if($scope.selectStatus.length==0){
-                $scope.selectStatus=$scope.statusList
-            }
-        }
-
-
-        //find all same element index
+        //find all same element index 
         function getSameElementIndex(array, element) {
             var indices = [];
             var idx = array.indexOf(element);
@@ -424,64 +284,31 @@ angular.module('opnfvApp')
 
         }
 
-
-        $scope.VersionOption = [
-            { title: 'Colorado' },
-            { title: 'Master' }
-        ];
-        $scope.VersionConfig = {
-            create: true,
-            valueField: 'title',
-            labelField: 'title',
-            delimiter: '|',
-            maxItems: 1,
-            placeholder: 'Version',
-            onChange: function (value) {
-                checkElementArrayValue($scope.selection, $scope.VersionOption);
-                $scope.selection.push(value);
-                // console.log($scope.selection);
-
+        function radioSetting(array1, array2, array3) {
+            var tempVersion = [];
+            var tempLoop = [];
+            var tempTime = [];
+            for (var i = 0; i < array1.length; i++) {
+                var temp = {
+                    title: array1[i]
+                };
+                tempVersion.push(temp);
             }
-
-        }
-
-        $scope.LoopOption = [
-            { title: 'Daily' },
-            { title: 'Weekly' },
-            { title: 'Monthly' }
-        ];
-        $scope.LoopConfig = {
-            create: true,
-            valueField: 'title',
-            labelField: 'title',
-            delimiter: '|',
-            maxItems: 1,
-            placeholder: 'Loop',
-            onChange: function (value) {
-                checkElementArrayValue($scope.selection, $scope.LoopOption);
-                $scope.selection.push(value);
-                // console.log($scope.selection);
-
+            for (var i = 0; i < array2.length; i++) {
+                var temp = {
+                    title: array2[i]
+                };
+                tempLoop.push(temp);
             }
-        }
-
-        $scope.TimeOption = [
-            { title: '10 days' },
-            { title: '1 month' }
-        ];
-        $scope.TimeConfig = {
-            create: true,
-            valueField: 'title',
-            labelField: 'title',
-            delimiter: '|',
-            maxItems: 1,
-            placeholder: 'Time',
-            onChange: function (value) {
-                checkElementArrayValue($scope.selection, $scope.TimeOption);
-                $scope.selection.push(value);
-                // console.log($scope.selection)
-
+            for (var i = 0; i < array3.length; i++) {
+                var temp = {
+                    title: array3[i]
+                };
+                tempTime.push(temp);
             }
+            $scope.VersionOption = tempVersion;
+            $scope.LoopOption = tempLoop;
+            $scope.TimeOption = tempTime;
         }
 
         //remove element in the array
@@ -508,13 +335,51 @@ angular.module('opnfvApp')
 
             if (idx > -1) {
                 $scope.selection.splice(idx, 1);
-            }
-            else {
+                filterData($scope.selection)
+            else {
                 $scope.selection.push(status);
+                filterData($scope.selection)
             }
-            console.log($scope.selection);
-            filterData();
+            // console.log($scope.selection);
 
         }
 
-    }]);
+        //filter function
+        function filterData(selection) {
+
+            $scope.selectInstallers = [];
+            $scope.selectProjects = [];
+            $scope.selectStatus = [];
+            for (var i = 0; i < selection.length; i++) {
+                if ($scope.statusListString.indexOf(selection[i]) > -1) {
+                    $scope.selectStatus.push(selection[i]);
+                }
+                if ($scope.projectListString.indexOf(selection[i]) > -1) {
+                    $scope.selectProjects.push(selection[i]);
+                }
+                if ($scope.installerListString.indexOf(selection[i]) > -1) {
+                    $scope.selectInstallers.push(selection[i]);
+                }
+            }
+
+            $scope.colspan = $scope.selectProjects.length;
+            //when some selection is empty, we set it full
+            if ($scope.selectInstallers.length == 0) {
+                $scope.selectInstallers = $scope.installerList;
+
+            }
+            if ($scope.selectProjects.length == 0) {
+                $scope.selectProjects = $scope.projectList;
+                $scope.colspan = $scope.tableDataAll.colspan;
+            }
+            if ($scope.selectStatus.length == 0) {
+                $scope.selectStatus = $scope.statusList
+            }
+
+            // console.log($scope.selectStatus);
+            // console.log($scope.selectProjects);
+
+        }
+
+
+    }]);
\ No newline at end of file
diff --git a/utils/test/reporting/pages/app/scripts/data.json b/utils/test/reporting/pages/app/scripts/data.json
deleted file mode 100644 (file)
index a15fdf3..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-
-{"scenarios": {
-    "os-nosdn-kvm-noha": {
-        "status": "Success",
-        "installers": {
-            "apex": [
-                {
-                    "project": "Deployment",
-                    "score": "13/14",
-                    "status": "SUCCESS"
-                },
-                {
-                    "project": "Functest",
-                    "score": "13/14",
-                    "status": "SUCCESS"
-                },
-                {
-                    "project": "Yardstick",
-                    "socre": "13/14",
-                    "status": "SUCCESS"
-                }
-            ],
-            "compass": [
-                {
-                    "project": "Deployment",
-                    "score": "13/14",
-                    "status": "SUCCESS"
-                },
-                {
-                    "project": "Functest",
-                    "score": "13/14",
-                    "status": "SUCCESS"
-                },
-                {
-                    "project": "Yardstick",
-                    "socre": "13/14",
-                    "status": "SUCCESS"
-                }
-            ],
-            "fuel": [
-                {
-                    "project": "Deployment",
-                    "score": "13/14",
-                    "status": "SUCCESS"
-                },
-                {
-                    "project": "Functest",
-                    "score": "13/14",
-                    "status": "SUCCESS"
-                },
-                {
-                    "project": "Yardstick",
-                    "socre": "13/14",
-                    "status": "SUCCESS"
-                }
-            ],
-            "joid": [
-                {
-                    "project": "Deployment",
-                    "score": "13/14",
-                    "status": "SUCCESS"
-                },
-                {
-                    "project": "Functest",
-                    "score": "13/14",
-                    "status": "SUCCESS"
-                },
-                {
-                    "project": "Yardstick",
-                    "socre": "13/14",
-                    "status": "SUCCESS"
-                }
-            ]
-        }
-    }
-}}
index 2244322..a2e2aef 100644 (file)
@@ -4,17 +4,23 @@
  * get data factory
  */
 angular.module('opnfvApp')
-    .factory('TableFactory', function ($resource, $rootScope) {
-        // var baseUrl = base_Url;
+    .factory('TableFactory', function($resource, $rootScope) {
 
         return {
-            getFilter: function () {
-                return $resource(baseUrl + '/', {}, {
-                    'post': {
-                        method: 'POST',
+            getFilter: function() {
+                return $resource(BASE_URL + '/filters', {}, {
+                    'get': {
+                        method: 'GET',
 
                     }
                 });
+            },
+            getScenario: function() {
+                return $resource(BASE_URL + '/scenarios', {}, {
+                    'post': {
+                        method: 'POST',
+                    }
+                })
             }
         };
-    });
+    });
\ No newline at end of file
index dadc68a..b498cf0 100644 (file)
@@ -1,8 +1,8 @@
 .container-tablesize {
-     margin: auto 5%;
+    margin: auto 5%;
 }
 
-.btn-outline  {
+.btn-outline {
     border-color: white;
 }
 
 }
 
 .myhr {
-    border:0.5px dashed #e7eaec;
-    border-top:1px;margin-bottom: 3px;
-}
\ No newline at end of file
+    border: 0.5px dashed #e7eaec;
+    border-top: 1px;
+    margin-bottom: 3px;
+}
+
+td.null {
+    background-color: #e7eaec;
+    color: #e7eaec;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+    cursor: not-allowed;
+    display: none;
+}
+
+body,
+html {
+    margin: 0;
+    padding: 0;
+    min-height: 100%;
+}
+
+
+/*img[usemap] {
+    border: none;
+    height: auto;
+    max-width: 100%;
+    width: auto;
+}*/
+
+.popup {
+    position: absolute;
+    display: none;
+    /*background-color: #dd8;*/
+    border-radius: 5px 5px 5px 5px;
+    background-color: #f3f3f4;
+    opacity: 0.9;
+}
+
+
+/*
+body {
+    height: 1200px;
+}
+
+html {
+    min-height: 100%;
+}*/
+
+
+/*html,
+body {
+    height: 100%;
+}
+
+#page-wrapper {
+    position: inherit;
+    margin: 0 0 0 220px;
+    min-height: 773px;
+}*/
\ No newline at end of file
index 187805a..94fb549 100644 (file)
 <glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
 <glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
 </font>
-</defs></svg>
+</defs></svg> 
\ No newline at end of file
index ed9300e..f504bd7 100644 (file)
                     <div class=" col-md-12" data-toggle="buttons" aria-pressed="false">
 
                         <label> Status </label> &nbsp;&nbsp; &nbsp;
-                          <label class="btn btn-outline btn-success btn-sm" style="height:25px; margin-right: 5px;" ng-repeat="status in statusList"
-                           value={{status}} ng-checked="selection.indexOf(status)>-1" ng-click="toggleSelection(status)">
+                        <label class="btn btn-outline btn-success btn-sm" style="height:25px; margin-right: 5px;" ng-repeat="status in statusList" value={{status}} ng-checked="selection.indexOf(status)>-1" ng-click="toggleSelection(status)">
                               <input type="checkbox"  disabled="disabled" > {{status}}
+                            
                           </label>
                     </div>
 
-                <hr class="myhr">
+                    <hr class="myhr">
 
                     <div class=" col-md-12" data-toggle="buttons">
-                     <label> Projects </label> &nbsp;
-                        <label class="btn btn-outline btn-success btn-sm " style="height:25px;margin-right: 5px;" ng-repeat="project in projectList"
-                        value={{project}} ng-checked="selection.indexOf(project)>-1" ng-click="toggleSelection(project)">
+                        <label> Projects </label> &nbsp;
+                        <label class="btn btn-outline btn-success btn-sm " style="height:25px;margin-right: 5px;" ng-repeat="project in projectList" value={{project}} ng-checked="selection.indexOf(project)>-1" ng-click="toggleSelection(project)">
                             <input type="checkbox" disabled="disabled"> {{project}}
                         </label>
 
                     </div>
-              <hr class="myhr">
+                    <hr class="myhr">
                     <div class=" col-md-12" data-toggle="buttons">
                         <label> Installers </label>
-                            <label class="btn btn-outline btn-success btn-sm" style="height:25px;margin-right: 5px;" ng-repeat="installer in installerList"
-                            value={{installer}} ng-checked="selection.indexOf(installer)" ng-click="toggleSelection(installer)">
+                        <label class="btn btn-outline btn-success btn-sm" style="height:25px;margin-right: 5px;" ng-repeat="installer in installerList" value={{installer}} ng-checked="selection.indexOf(installer)>-1" ng-click="toggleSelection(installer)">
                             <input type="checkbox" disabled="disabled"> {{installer}}
                             </label>
-                   </div>
+                    </div>
 
-                <hr style="border:0.5px dashed #e7eaec;border-top:1px;margin-bottom:10px;">
+                    <hr style="border:0.5px dashed #e7eaec;border-top:1px;margin-bottom:10px;">
 
 
-                <div class=" col-md-1" style="margin-top:5px;margin-right: 5px;">
-                    <selectize options="VersionOption" ng-model="VersionSelected" config="VersionConfig"></selectize>
+                    <div class=" col-md-1" style="margin-top:5px;margin-right: 5px;">
+                        <selectize options="VersionOption" ng-model="VersionSelected" config="VersionConfig"></selectize>
 
-                </div>
+                    </div>
 
-                <div class=" col-md-1" style="margin-top:5px;margin-left: 5px;margin-right: 5px;">
-                     <selectize options="LoopOption" ng-model="LoopCiSelected" config="LoopConfig"></selectize>
+                    <div class=" col-md-1" style="margin-top:5px;margin-right: 5px;">
+                        <selectize options="LoopOption" ng-model="LoopCiSelected" config="LoopConfig"></selectize>
 
-                </div>
+                    </div>
 
-                <div class=" col-md-1" style="margin-top:5px;margin-left: 5px;margin-right: 5px;">
-                     <selectize options="TimeOption" ng-model="TimeSelected" config="TimeConfig"></selectize>
+                    <div class=" col-md-1" style="margin-top:5px;margin-right: 5px;">
+                        <selectize options="TimeOption" ng-model="TimeSelected" config="TimeConfig"></selectize>
+                    </div>
                 </div>
+                <div class="table-responsive">
+
+                    <table class="table table-bordered" id="table" ng-model="tableDataAll">
+                        <thead class="thead">
+                            <tr>
+                                <th>Scenario </th>
+                                <th colspan={{colspan}} ng-show="selectInstallers.indexOf(key)!=-1" value={{key}} ng-repeat="key in tableDataAll.Installer"><a href="notfound.html">{{key}}</a> </th>
+                            </tr>
 
+                            <tr>
 
-</div>
+                                <td></td>
+                                <td ng-show="selectProjects.indexOf(project[0])!=-1 && selectInstallers.indexOf(project[1])!=-1" ng-repeat="project in tableDataAll.Projects track by $index" data={{project[1]}} value={{project[0]}}>{{project[0]}}</td>
 
-<table class="table table-bordered" id="table" ng-model="tableDataAll">
-    <thead class="thead">
-        <tr >
-            <th>Scenario </th>
-            <th colspan={{colspan}} ng-show="selectInstallers.indexOf(key)!=-1" value={{key}} ng-repeat="key in tableDataAll.Installer"><a href="notfound.html">{{key}}</a> </th>
-        </tr>
+                            </tr>
+                        </thead>
+                        <tbody class="tbody">
+                            <tr ng-repeat="scenario in tableDataAll.scenario" ng-show="selectStatus.indexOf(scenario.status)!=-1">
 
-        <tr>
+                                <td nowrap="nowrap" data={{scenario.status}}><span class="fa fa-circle text-{{scenario.statusDisplay}}"></span> <a href="notfound.html">{{scenario.scenarioName}}</a> </td>
 
-            <td align="justify"></td>
-            <td align="justify" ng-show="selectProjects.indexOf(project[0])!=-1 && selectInstallers.indexOf(project[1])!=-1" ng-repeat="project in tableDataAll.Projects track by $index" data={{project[1]}} value={{project[0]}}>{{project[0]}}</td>
-        </tr>
-    </thead>
-    <tbody class="tbody">
-        <tr ng-repeat="scenario in tableDataAll.scenario" ng-show="selectStatus.indexOf(scenario.status)!=-1" >
+                                <!--<td style="background-color:#e7eaec" align="justify" ng-if="data[0]=='Not Support'" ng-repeat="data in scenario.datadisplay track by $index" data={{data[1]}} value={{data[2]}}></td>-->
 
-            <td align="justify" data={{scenario.status}}><span class="fa fa-circle text-warning"><a href="notfound.html">{{scenario.scenarioName}}</a></span> </td>
-            <td align="justify" ng-show="selectInstallers.indexOf(data[2])!=-1 && selectProjects.indexOf(data[1])!=-1" ng-repeat="data in scenario.datadisplay track by $index" data={{data[1]}} value={{data[2]}} ><span class="label label-danger">D<a href="notfound.html"></a></span> {{data[0]}}</td>
-        </tr>
-    </tbody>
-</table>
+                                <td nowrap="nowrap" ng-show="selectInstallers.indexOf(data[2])!=-1 && selectProjects.indexOf(data[1])!=-1" ng-repeat="data in scenario.datadisplay track by $index" data={{data[1]}} value={{data[2]}} class={{data[0]}}>
+                                    <span class="label label-{{data[3]}}">{{data[4]}}</a></span> {{data[0]}}</td>
 
-                <div class="pull-right">
-                <span class="label label-danger">D</span>danger<span style="padding-left:20px"></span>
-                <span class="label label-primary">S</span><span>success</span><span style="padding-left:20px"></span>
-                <span class="label label-warning">W</span><span>warning</span>
 
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <div class="pull-right" style="margin-top: 5px">
+                    <span class="label label-danger">G</span>gold<span style="padding-left:20px"></span>
+                    <span class="label label-primary">P</span><span>platinium</span><span style="padding-left:20px"></span>
+                    <span class="label label-warning">S</span><span>silver</span>
                 </div>
+            </div>
         </div>
     </div>
-</div>
 
-</section>
+</section>
\ No newline at end of file
index 1e3fe9e..cca8937 100644 (file)
-
 <div class="navbar-wrapper">
-  <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
-    <div class="container">
-      <div class="navbar-header page-scroll">
-        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false"
-          aria-controls="navbar">
+    <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
+        <div class="container">
+            <div class="navbar-header page-scroll">
+                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                         <span class="sr-only">Toggle navigation</span>
                         <span class="icon-bar"></span>
                         <span class="icon-bar"></span>
                         <span class="icon-bar"></span>
                     </button>
-        <a class="navbar-brand" href="index.html">OPNFV-DASHBOARD</a>
-      </div>
-      <div id="navbar" class="navbar-collapse collapse">
-        <ul class="nav navbar-nav navbar-right">
-          <li><a href="#page-top">Home</a></li>
-          <li><a href="#DashBoard">DashBoard</a></li>
-          <!--<li><a href="#team">Team</a></li>
+                <a class="navbar-brand" href="index.html">OPNFV-DASHBOARD</a>
+            </div>
+            <div class="navbar-collapse collapse">
+                <ul class="nav navbar-nav navbar-right">
+                    <li><a href="#page-top">Home</a></li>
+                    <li><a href="#DashBoard">DashBoard</a></li>
+                    <li><a ui-sref="select.selectTestCase">TestCase</a></li>
+                    <li><a ui-sref="login">Login</a></li>
+                    <!--<li><a href="#team">Team</a></li>
                         <li><a href="#testimonials">Testimonials</a></li>
                         <li><a href="#pricing">Pricing</a></li>
                         <li><a href="#contact">Contact</a></li>-->
-        </ul>
-      </div>
-    </div>
-  </nav>
+                </ul>
+            </div>
+        </div>
+    </nav>
 </div>
 
 
 <div id="inSlider" class="carousel carousel-fade" data-ride="carousel">
-  <ol class="carousel-indicators">
-    <!--<li data-target="#inSlider" data-slide-to="0" class="active"></li>
+    <ol class="carousel-indicators">
+        <!--<li data-target="#inSlider" data-slide-to="0" class="active"></li>
         <li data-target="#inSlider" data-slide-to="1"></li>-->
-  </ol>
-  <div class="carousel-inner" role="listbox">
-    <div class="item active">
-      <div class="container">
-        <div class="carousel-caption">
-          <h1>OPNFV<br/> facilitates the development and evolution<br/> of NFV components across<br/> various open source ecosystems<br/>
-          </h1>
-          <!--<p>Lorem Ipsum is simply dummy text of the printing.</p>
+    </ol>
+    <div class="carousel-inner" role="listbox">
+        <div class="item active">
+            <div class="container">
+                <div class="carousel-caption">
+                    <h1>OPNFV<br/> facilitates the development and evolution<br/> of NFV components across<br/> various open source ecosystems<br/>
+                    </h1>
+                    <!--<p>Lorem Ipsum is simply dummy text of the printing.</p>
                     <p>-->
-          <a class="btn btn-lg btn-primary" href="#" role="button">READ MORE</a>
-          <!--<a class="caption-link" href="#" role="button">Inspinia Theme</a>-->
-          <!--</p>-->
+                    <a class="btn btn-lg btn-primary" href="#" role="button">READ MORE</a>
+                    <!--<a class="caption-link" href="#" role="button">Inspinia Theme</a>-->
+                    <!--</p>-->
+                </div>
+
+            </div>
+            <!-- Set background for slide in css -->
+            <div class="header-back one" style="background: url('images/header_one.jpg') 50% 0 no-repeat;"></div>
+
         </div>
-        <!--<div class="carousel-image wow zoomIn">
-                    <img src="img/landing/laptop.png" alt="laptop"/>
-                </div>-->
-      </div>
-      <!-- Set background for slide in css -->
-      <div class="header-back one" style="background: url('images/header_one.jpg') 50% 0 no-repeat;"></div>
 
     </div>
-    <!--<div class="item">
-            <div class="container">
-                <div class="carousel-caption blank">
-                    <h1>We create meaningful <br/> interfaces that inspire.</h1>
-                    <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam.</p>
-                    <p><a class="btn btn-lg btn-primary" href="#" role="button">Learn more</a></p>
-                </div>
-            </div>-->
-    <!-- Set background for slide in css -->
-    <!--<div class="header-back two"></div>
-        </div>-->
-  </div>
-  <!--<a class="left carousel-control" href="#inSlider" role="button" data-slide="prev">
-        <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
-        <span class="sr-only">Previous</span>
-    </a>
-    <a class="right carousel-control" href="#inSlider" role="button" data-slide="next">
-        <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
-        <span class="sr-only">Next</span>
-    </a>-->
+
 </div>
 
-  <section id="DashBoard" class="container services">
-        <div class="row">
+<section id="DashBoard" class="container services">
+    <div class="row">
 
-            <h1>
-                OPNFV’s goals are to:
-            </h1>
-            <div class="col-sm-3">
+        <h1>
+            OPNFV’s goals are to:
+        </h1>
+        <div class="col-sm-3">
 
-                <p>Develop an integrated and tested open source platform that can be used to build NFV functionality--accelerating
-                    the introduction of new products and services</p>
-                <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
-            </div>
-            <div class="col-sm-3">
+            <p>Develop an integrated and tested open source platform that can be used to build NFV functionality--accelerating the introduction of new products and services</p>
+            <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
+        </div>
+        <div class="col-sm-3">
 
-                <p>Include participation of leading end users to validate that OPNFV meets the needs of user community</p>
-                <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
-            </div>
-            <div class="col-sm-3">
+            <p>Include participation of leading end users to validate that OPNFV meets the needs of user community</p>
+            <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
+        </div>
+        <div class="col-sm-3">
 
-                <p>Contribute to and participate in relevant open source projects that will be leveraged in the OPNFV platform;
-                    ensuring consistency, performance and interoperability among open source components</p>
-                <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
-            </div>
-            <div class="col-sm-3">
+            <p>Contribute to and participate in relevant open source projects that will be leveraged in the OPNFV platform; ensuring consistency, performance and interoperability among open source components</p>
+            <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
+        </div>
+        <div class="col-sm-3">
 
-                <p>Establish an ecosystem for NFV solutions based on open standards and software to meet the needs of end users</p>
-                <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
-            </div>
-            <div class="col-sm-3">
+            <p>Establish an ecosystem for NFV solutions based on open standards and software to meet the needs of end users</p>
+            <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
+        </div>
+        <div class="col-sm-3">
 
-                <p>Promote OPNFV as the preferred platform and community for open source NFV</p>
-                <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
-            </div>
+            <p>Promote OPNFV as the preferred platform and community for open source NFV</p>
+            <p><a class="navy-link" href="#" role="button">Details &raquo;</a></p>
         </div>
-    </section>
+    </div>
+</section>
 
 
 <div ui-view></div>
 
 <section id="contact" class="gray-section contact" style="background-image: url(images/word_map.png)">
-  <div class="container">
-    <div class="row m-b-lg">
-      <div class="col-lg-12 text-center">
-        <div class="navy-line"></div>
-        <h1>Contact Us</h1>
-      </div>
-    </div>
-    <div class="row m-b-lg">
-      <div class="col-lg-3 col-lg-offset-3">
-        <address>
+    <div class="container">
+        <div class="row m-b-lg">
+            <div class="col-lg-12 text-center">
+                <div class="navy-line"></div>
+                <h1>Contact Us</h1>
+            </div>
+        </div>
+        <div class="row m-b-lg">
+            <div class="col-lg-3 col-lg-offset-3">
+                <address>
           <strong><span class="navy">Press, Analyst, or Speaking Inquiries</span></strong><br/> pr@opnfv.org
           <br/>
         </address>
-        <address>
+                <address>
           <strong><span class="navy">OPNFV Events</span></strong><br/> events@opnfv.org
           <br/>
         </address>
-        <address>
+                <address>
           <strong><span class="navy">IT Support</span></strong><br/>opnfv-helpdesk@rt.linuxfoundation.org
           <br/>
         </address>
-      </div>
+            </div>
 
-      <div class="col-lg-4">
-        <address>
+            <div class="col-lg-4">
+                <address>
           <strong><span class="navy">To submit and track bugs related to OPNFV</span></strong><br/>Please visit https://jira.opnfv.org
           <br/>
         </address>
-        <address>
+                <address>
           <strong><span class="navy">Newsletter</span></strong><br/>Sign up for the OPNFV newsletter
           <br/>
         </address>
-        <address>
+                <address>
           <strong><span class="navy">Membership</span></strong><br/>Please visit the Join as a Member page
           <br/>
         </address>
 
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-lg-12 text-center">
-        <img src="images/logo.png" />
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-lg-12 text-center">
+                <img src="images/logo.png" />
 
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-lg-8 col-lg-offset-2 text-center m-t-lg m-b-lg">
-        <p><strong>&copy; 2016 Open Platform for NFV Project, Inc</strong><br/> A Linux Foundation Collaborative Project. All
-          Rights Reserved. Open Platform for NFV and OPNFV are trademarks of the Open Platform for NFV Project, Inc. Linux
-          Foundation is a registered trademark of The Linux Foundation. Linux is a registered trademark of Linus Torvalds.
-          Please see our terms of use, trademark policy, and privacy policy.
-        </p>
-      </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-lg-8 col-lg-offset-2 text-center m-t-lg m-b-lg">
+                <p><strong>&copy; 2016 Open Platform for NFV Project, Inc</strong><br/> A Linux Foundation Collaborative Project. All Rights Reserved. Open Platform for NFV and OPNFV are trademarks of the Open Platform for NFV Project, Inc. Linux Foundation
+                    is a registered trademark of The Linux Foundation. Linux is a registered trademark of Linus Torvalds. Please see our terms of use, trademark policy, and privacy policy.
+                </p>
+            </div>
+        </div>
     </div>
-  </div>
 </section>
 
 <script>
+    $(document).ready(function() {
 
-    $(document).ready(function () {
+        // $('body').scrollspy({
+        //     target: '.navbar-fixed-top',
+        //     offset: 80
+        // });
 
-        $('body').scrollspy({
-            target: '.navbar-fixed-top',
-            offset: 80
+        //Page scrolling feature
+        $('a.page-scroll').bind('click', function(event) {
+            var link = $(this);
+            $('html, body').stop().animate({
+                scrollTop: $(link.attr('href')).offset().top - 50
+            }, 500);
+            event.preventDefault();
+            $("#navbar").collapse('hide');
         });
 
-        // Page scrolling feature
         $('a.page-scroll').bind('click', function(event) {
             var link = $(this);
             $('html, body').stop().animate({
             $("#navbar").collapse('hide');
         });
 
-
-          console.log(  $("selectVersion").val());
-
     });
 
-            // $(".select2_demo_1").select2();
-            // $(".select2_demo_2").select2();
-            // $(".select2_demo_3").select2({
-            //     placeholder: "Version",
-            //     allowClear: true
-            // });
-            //   $(".select2_demo_4").select2({
-            //     placeholder: "Period",
-            //     allowClear: true
-            // });
-
-
     var config = {
-                '.chosen-select'           : {},
-                '.chosen-select-deselect'  : {allow_single_deselect:true},
-                '.chosen-select-no-single' : {disable_search_threshold:10},
-                '.chosen-select-no-results': {no_results_text:'Oops, nothing found!'},
-                '.chosen-select-width'     : {width:"95%"}
-                }
-            for (var selector in config) {
-                $(selector).chosen(config[selector]);
-            }
+        '.chosen-select': {},
+        '.chosen-select-deselect': {
+            allow_single_deselect: true
+        },
+        '.chosen-select-no-single': {
+            disable_search_threshold: 10
+        },
+        '.chosen-select-no-results': {
+            no_results_text: 'Oops, nothing found!'
+        },
+        '.chosen-select-width': {
+            width: "95%"
+        }
+    }
+    for (var selector in config) {
+        $(selector).chosen(config[selector]);
+    }
 
     var cbpAnimatedHeader = (function() {
         var docElem = document.documentElement,
-                header = document.querySelector( '.navbar-default' ),
-                didScroll = false,
-                changeHeaderOn = 200;
+            header = document.querySelector('.navbar-default'),
+            didScroll = false,
+            changeHeaderOn = 200;
+
         function init() {
-            window.addEventListener( 'scroll', function( event ) {
-                if( !didScroll ) {
+            window.addEventListener('scroll', function(event) {
+                if (!didScroll) {
                     didScroll = true;
-                    setTimeout( scrollPage, 250 );
+                    setTimeout(scrollPage, 250);
                 }
-            }, false );
+            }, false);
         }
+
         function scrollPage() {
             var sy = scrollY();
-            if ( sy >= changeHeaderOn ) {
+            if (sy >= changeHeaderOn) {
                 $(header).addClass('navbar-scroll')
-            }
-            else {
+            } else {
                 $(header).removeClass('navbar-scroll')
             }
             didScroll = false;
         }
+
         function scrollY() {
             return window.pageYOffset || docElem.scrollTop;
         }
         init();
 
     })();
-
-
-</script>
+</script>
\ No newline at end of file
index dd0996d..bfc4df3 100644 (file)
@@ -1,32 +1,47 @@
 {
-  "name": "opnfv",
-  "version": "0.0.0",
-  "dependencies": {
-    "angular": "^1.4.0",
-    "bootstrap": "^3.2.0",
-    "angular-animate": "^1.4.0",
-    "jquery-slimscroll": "slimscroll#^1.3.8",
-    "metisMenu": "~2.0.2",
-    "chosen": "^1.6.2",
-    "oclazyload": "^1.0.9",
-    "angular-bootstrap": "~1.1.2",
-    "angular-ui-router": "~0.2.15",
-    "angular-resource": "^1.6.0",
-    "angular-selectize2": "^3.0.1",
-    "components-font-awesome": "^4.7.0"
-  },
-  "devDependencies": {
-    "angular-mocks": "^1.4.0"
-  },
-  "appPath": "app",
-  "moduleName": "opnfvApp",
-  "overrides": {
-    "bootstrap": {
-      "main": [
-        "less/bootstrap.less",
-        "dist/css/bootstrap.css",
-        "dist/js/bootstrap.js"
-      ]
+    "name": "opnfv",
+    "version": "0.0.0",
+    "dependencies": {
+        "angular": "^1.4.0",
+        "bootstrap": "^3.2.0",
+        "angular-animate": "^1.4.0",
+        "jquery-slimscroll": "slimscroll#^1.3.8",
+        "metisMenu": "~2.0.2",
+        "chosen": "^1.6.2",
+        "oclazyload": "^1.0.9",
+        "angular-bootstrap": "~1.1.2",
+        "angular-ui-router": "~0.2.15",
+        "angular-resource": "^1.6.0",
+        "angular-selectize2": "^3.0.1",
+        "components-font-awesome": "^4.7.0",
+        "angular-tooltips": "^1.1.8",
+        "jQuery-rwdImageMaps": "*",
+        "animate.css": "^3.5.2",
+        "ng-dialog": "^1.0.0",
+        "inspiniacss": "^0.0.1"
+    },
+    "devDependencies": {
+        "angular-mocks": "^1.4.0"
+    },
+    "appPath": "app",
+    "moduleName": "opnfvApp",
+    "overrides": {
+        "bootstrap": {
+            "main": [
+                "less/bootstrap.less",
+                "dist/css/bootstrap.css",
+                "dist/js/bootstrap.js"
+            ]
+        },
+        "jQuery-rwdImageMaps": {
+            "main": [
+                "jquery.rwdImageMaps.min.js"
+            ]
+        },
+        "inspiniacss": {
+            "main": [
+                "style.css"
+            ]
+        }
     }
-  }
-}
+}
\ No newline at end of file
index 2b0f41c..5c2e79b 100644 (file)
@@ -36,6 +36,7 @@ module.exports = function(config) {
       'bower_components/microplugin/src/microplugin.js',
       'bower_components/selectize/dist/js/selectize.js',
       'bower_components/angular-selectize2/dist/angular-selectize.js',
+      'bower_components/angular-tooltips/dist/angular-tooltips.min.js',
       'bower_components/angular-mocks/angular-mocks.js',
       // endbower
       'app/scripts/**/*.js',
index f518c97..0ea482f 100644 (file)
-##############################################################################\r
-# Copyright (c) 2015 Orange\r
-# guyrodrigue.koffi@orange.com / koffirodrigue@gmail.com\r
-# All rights reserved. This program and the accompanying materials\r
-# are made available under the terms of the Apache License, Version 2.0\r
-# which accompanies this distribution, and is available at\r
-# http://www.apache.org/licenses/LICENSE-2.0\r
-# feng.xiaowei@zte.com.cn  mv Pod to pod_models.py                 5-18-2016\r
-# feng.xiaowei@zte.com.cn  add MetaCreateResponse/MetaGetResponse  5-18-2016\r
-# feng.xiaowei@zte.com.cn  mv TestProject to project_models.py     5-19-2016\r
-# feng.xiaowei@zte.com.cn  delete meta class                       5-19-2016\r
-# feng.xiaowei@zte.com.cn  add CreateResponse                      5-19-2016\r
-# feng.xiaowei@zte.com.cn  mv TestCase to testcase_models.py       5-20-2016\r
-# feng.xiaowei@zte.com.cn  mv TestResut to result_models.py        5-23-2016\r
-# feng.xiaowei@zte.com.cn  add ModelBase                           12-20-2016\r
-##############################################################################\r
-import copy\r
-\r
-from opnfv_testapi.tornado_swagger import swagger\r
-\r
-\r
-class ModelBase(object):\r
-\r
-    def _format(self, excludes):\r
-        new_obj = copy.deepcopy(self)\r
-        dicts = new_obj.__dict__\r
-        for k in dicts.keys():\r
-            if k in excludes:\r
-                del dicts[k]\r
-            elif dicts[k]:\r
-                if hasattr(dicts[k], 'format'):\r
-                    dicts[k] = dicts[k].format()\r
-                elif isinstance(dicts[k], list):\r
-                    hs = list()\r
-                    [hs.append(h.format() if hasattr(h, 'format') else str(h))\r
-                     for h in dicts[k]]\r
-                    dicts[k] = hs\r
-                elif not isinstance(dicts[k], (str, int, float, dict)):\r
-                    dicts[k] = str(dicts[k])\r
-        return dicts\r
-\r
-    def format(self):\r
-        return self._format(['_id'])\r
-\r
-    def format_http(self):\r
-        return self._format([])\r
-\r
-    @staticmethod\r
-    def attr_parser():\r
-        return {}\r
-\r
-    @classmethod\r
-    def from_dict(cls, a_dict):\r
-        if a_dict is None:\r
-            return None\r
-\r
-        attr_parser = cls.attr_parser()\r
-        t = cls()\r
-        for k, v in a_dict.iteritems():\r
-            value = v\r
-            if isinstance(v, dict) and k in attr_parser:\r
-                value = attr_parser[k].from_dict(v)\r
-            elif isinstance(v, list) and k in attr_parser:\r
-                value = []\r
-                for item in v:\r
-                    value.append(attr_parser[k].from_dict(item))\r
-\r
-            t.__setattr__(k, value)\r
-\r
-        return t\r
-\r
-\r
-@swagger.model()\r
-class CreateResponse(ModelBase):\r
-    def __init__(self, href=''):\r
-        self.href = href\r
-\r
-\r
-@swagger.model()\r
-class Versions(ModelBase):\r
-    """\r
-        @property versions:\r
-        @ptype versions: C{list} of L{Version}\r
-    """\r
-\r
-    def __init__(self):\r
-        self.versions = list()\r
-\r
-    @staticmethod\r
-    def attr_parser():\r
-        return {'versions': Version}\r
-\r
-\r
-@swagger.model()\r
-class Version(ModelBase):\r
-    def __init__(self, version=None, description=None):\r
-        self.version = version\r
-        self.description = description\r
+##############################################################################
+# Copyright (c) 2015 Orange
+# guyrodrigue.koffi@orange.com / koffirodrigue@gmail.com
+# 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
+# feng.xiaowei@zte.com.cn  mv Pod to pod_models.py                 5-18-2016
+# feng.xiaowei@zte.com.cn  add MetaCreateResponse/MetaGetResponse  5-18-2016
+# feng.xiaowei@zte.com.cn  mv TestProject to project_models.py     5-19-2016
+# feng.xiaowei@zte.com.cn  delete meta class                       5-19-2016
+# feng.xiaowei@zte.com.cn  add CreateResponse                      5-19-2016
+# feng.xiaowei@zte.com.cn  mv TestCase to testcase_models.py       5-20-2016
+# feng.xiaowei@zte.com.cn  mv TestResut to result_models.py        5-23-2016
+# feng.xiaowei@zte.com.cn  add ModelBase                           12-20-2016
+##############################################################################
+import copy
+import ast
+
+
+from opnfv_testapi.tornado_swagger import swagger
+
+
+class ModelBase(object):
+
+    def format(self):
+        return self._format(['_id'])
+
+    def format_http(self):
+        return self._format([])
+
+    @classmethod
+    def from_dict(cls, a_dict):
+        if a_dict is None:
+            return None
+
+        attr_parser = cls.attr_parser()
+        t = cls()
+        for k, v in a_dict.iteritems():
+            value = v
+            if isinstance(v, dict) and k in attr_parser:
+                value = attr_parser[k].from_dict(v)
+            elif isinstance(v, list) and k in attr_parser:
+                value = []
+                for item in v:
+                    value.append(attr_parser[k].from_dict(item))
+
+            t.__setattr__(k, value)
+
+        return t
+
+    @staticmethod
+    def attr_parser():
+        return {}
+
+    def _format(self, excludes):
+        new_obj = copy.deepcopy(self)
+        dicts = new_obj.__dict__
+        for k in dicts.keys():
+            if k in excludes:
+                del dicts[k]
+            elif dicts[k]:
+                dicts[k] = self._obj_format(dicts[k])
+        return dicts
+
+    def _obj_format(self, obj):
+        if self._has_format(obj):
+            obj = obj.format()
+        elif isinstance(obj, unicode):
+            try:
+                obj = self._obj_format(ast.literal_eval(obj))
+            except:
+                try:
+                    obj = str(obj)
+                except:
+                    obj = obj
+        elif isinstance(obj, list):
+            hs = list()
+            for h in obj:
+                hs.append(self._obj_format(h))
+            obj = hs
+        elif not isinstance(obj, (str, int, float, dict)):
+            obj = str(obj)
+        return obj
+
+    @staticmethod
+    def _has_format(obj):
+        return not isinstance(obj, (str, unicode)) and hasattr(obj, 'format')
+
+
+@swagger.model()
+class CreateResponse(ModelBase):
+    def __init__(self, href=''):
+        self.href = href
+
+
+@swagger.model()
+class Versions(ModelBase):
+    """
+        @property versions:
+        @ptype versions: C{list} of L{Version}
+    """
+
+    def __init__(self):
+        self.versions = list()
+
+    @staticmethod
+    def attr_parser():
+        return {'versions': Version}
+
+
+@swagger.model()
+class Version(ModelBase):
+    def __init__(self, version=None, description=None):
+        self.version = version
+        self.description = description
index 73bcbe9..b84accf 100644 (file)
@@ -49,6 +49,24 @@ class ScenarioProject(models.ModelBase):
         return {'scores': ScenarioScore,
                 'trust_indicators': ScenarioTI}
 
+    def __eq__(self, other):
+        return [self.project == other.project and
+                self._customs_eq(other) and
+                self._scores_eq(other) and
+                self._ti_eq(other)]
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def _customs_eq(self, other):
+        return set(self.customs) == set(other.customs)
+
+    def _scores_eq(self, other):
+        return set(self.scores) == set(other.scores)
+
+    def _ti_eq(self, other):
+        return set(self.trust_indicators) == set(other.trust_indicators)
+
 
 @swagger.model()
 class ScenarioVersion(models.ModelBase):
@@ -64,6 +82,21 @@ class ScenarioVersion(models.ModelBase):
     def attr_parser():
         return {'projects': ScenarioProject}
 
+    def __eq__(self, other):
+        return [self.version == other.version and self._projects_eq(other)]
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def _projects_eq(self, other):
+        for s_project in self.projects:
+            for o_project in other.projects:
+                if s_project.project == o_project.project:
+                    if s_project != o_project:
+                        return False
+
+        return True
+
 
 @swagger.model()
 class ScenarioInstaller(models.ModelBase):
@@ -79,6 +112,21 @@ class ScenarioInstaller(models.ModelBase):
     def attr_parser():
         return {'versions': ScenarioVersion}
 
+    def __eq__(self, other):
+        return [self.installer == other.installer and self._versions_eq(other)]
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def _versions_eq(self, other):
+        for s_version in self.versions:
+            for o_version in other.versions:
+                if s_version.version == o_version.version:
+                    if s_version != o_version:
+                        return False
+
+        return True
+
 
 @swagger.model()
 class ScenarioCreateRequest(models.ModelBase):
@@ -126,6 +174,21 @@ class Scenario(models.ModelBase):
     def attr_parser():
         return {'installers': ScenarioInstaller}
 
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __eq__(self, other):
+        return [self.name == other.name and self._installers_eq(other)]
+
+    def _installers_eq(self, other):
+        for s_install in self.installers:
+            for o_install in other.installers:
+                if s_install.installer == o_install.installer:
+                    if s_install != o_install:
+                        return False
+
+        return True
+
 
 @swagger.model()
 class Scenarios(models.ModelBase):
index f604c57..7a6e94a 100644 (file)
@@ -39,10 +39,10 @@ class TestScenarioBase(base.TestBase):
         self.assertEqual(code, constants.HTTP_OK)
         if req is None:
             req = self.req_d
-        scenario_dict = scenario.format_http()
-        self.assertIsNotNone(scenario_dict['_id'])
-        self.assertIsNotNone(scenario_dict['creation_date'])
-        self.assertDictContainsSubset(req, scenario_dict)
+        self.assertIsNotNone(scenario._id)
+        self.assertIsNotNone(scenario.creation_date)
+
+        scenario == models.Scenario.from_dict(req)
 
     @staticmethod
     def _set_query(*args):