From 02d890d8033f70c9377941ab368443304e9f8d6f Mon Sep 17 00:00:00 2001
From: bhaskarhc <hcbhaskar7@gmail.com>
Date: Tue, 28 Jan 2020 14:31:40 +0530
Subject: [PATCH 1/5] move konvoy to stable release

Signed-off-by: bhaskarhc <hcbhaskar7@gmail.com>
---
 src/app/app.routing.ts                        |   4 +-
 src/app/services/ci-dashboard.service.ts      |  48 +++++------
 src/app/sidebar/sidebar.component.html        |   4 +-
 .../stable-release.component.html             |  56 ++++++++++---
 .../stable-release.component.scss             |  57 +++++++++----
 .../stable-release.component.ts               |  74 +++++++++++------
 src/app/table/table.component.html            |  78 +++---------------
 src/app/table/table.component.ts              |  40 ++++-----
 src/assets/images/cloud/konvoy.png            | Bin 0 -> 15099 bytes
 9 files changed, 191 insertions(+), 170 deletions(-)
 create mode 100644 src/assets/images/cloud/konvoy.png

diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts
index a6eac64..f6398d0 100644
--- a/src/app/app.routing.ts
+++ b/src/app/app.routing.ts
@@ -9,8 +9,8 @@ import { StableReleaseComponent } from "./stable-release/stable-release.componen
 
 const routes: Routes = [
   //routes without header and footer
-  { path: "", component: TableComponent },
-  { path: "stable-release", component: StableReleaseComponent },
+  { path: "development", component: TableComponent },
+  { path: "", component: StableReleaseComponent },
   { path: "workload-dashboard", component: WorkloadDashboardComponent },
   { path: "mongo-jiva", component: WorkloadsComponent },
   { path: "mongo-cstor", component: WorkloadsComponent },
diff --git a/src/app/services/ci-dashboard.service.ts b/src/app/services/ci-dashboard.service.ts
index 65a42d9..5bb45a1 100644
--- a/src/app/services/ci-dashboard.service.ts
+++ b/src/app/services/ci-dashboard.service.ts
@@ -1,44 +1,38 @@
 import { Injectable } from "@angular/core";
 import { HttpClient } from "@angular/common/http";
 import { map } from "rxjs/operators";
-import { Meta,Title } from '@angular/platform-browser';
+import { Meta, Title } from '@angular/platform-browser';
 
 @Injectable()
 export class DashboardData {
 
     private apiurl: string;
     host: any;
-    constructor(private http: HttpClient, private meta:Meta,private titleService: Title) {
+    constructor(private http: HttpClient, private meta: Meta, private titleService: Title) {
         this.host = window.location.host;
         if ((this.host.toString().indexOf("localhost") + 1) && this.host.toString().indexOf(":")) {
-          this.apiurl = "http://localhost:3000";
-        } else if (this.host == "openebs.ci" || this.host == "wwww.openebs.ci" ) {
+            this.apiurl = "http://localhost:3000";
+        } else if (this.host == "openebs.ci" || this.host == "wwww.openebs.ci") {
             this.apiurl = "https://openebs.ci/api";
         } else {
-          this.apiurl = "https://staging.openebs.ci/api";
+            this.apiurl = "https://staging.openebs.ci/api";
         }
     }
-
-    getPacketv15Details() {
-        return this.http.get<any[]>(this.apiurl + "/packet/v15");
-    }
-
-    getPacketv14Details() {
-        return this.http.get<any[]>(this.apiurl + "/packet/v14");
-    }
-
-    getPacketv13Details() {
-        return this.http.get<any[]>(this.apiurl + "/packet/v13");
-    }
-    getKonvoyDetails() {
-        return this.http.get<any[]>(this.apiurl + "/konvoy");
-    }
-
-    getBuildDetails() {
-        return this.http.get<any[]>(this.apiurl + "/build");
-    }
-
-    getOpenshiftReleaseDetails() {
-        return this.http.get<any[]>(this.apiurl + "/openshift/release");
+    getEndPointData(platform) {
+        switch (platform) {
+            case "packet-ultimate":
+                return this.http.get<any[]>(this.apiurl + "/packet/ultimate");
+            case "packet-penultimate":
+                return this.http.get<any[]>(this.apiurl + "/packet/penultimate");
+            case "packet-antepenultimate":
+                return this.http.get<any[]>(this.apiurl + "/packet/antepenultimate");
+            case "konvoy":
+                return this.http.get<any[]>(this.apiurl + "/konvoy");
+            case "openshift":
+                return this.http.get<any[]>(this.apiurl + "/openshift/release");
+            default:
+                console.log('Unable To Find Platform');
+                break;
+        }
     }
 }
diff --git a/src/app/sidebar/sidebar.component.html b/src/app/sidebar/sidebar.component.html
index 81f9147..4e01f72 100644
--- a/src/app/sidebar/sidebar.component.html
+++ b/src/app/sidebar/sidebar.component.html
@@ -11,13 +11,13 @@
     <div class="collapse navbar-collapse" id="sidebar">
       <ul class="list-unstyled justify-content-center w-100">
         <li *ngIf="vendor == 'false'"
-          class="item cursor-pointer rounded-left py-md-4 py-sm-1 button text-center border-bottom" routerLink="/"
+          class="item cursor-pointer rounded-left py-md-4 py-sm-1 button text-center border-bottom" routerLink="/development"
           [routerLinkActiveOptions]="{ exact : true }" routerLinkActive="active-link">
           <div>
             <h5>Development Branch</h5>
           </div>
         </li>
-        <li *ngIf="vendor == 'false'" routerLink="/stable-release" [routerLinkActiveOptions]="{ exact : true }"
+        <li *ngIf="vendor == 'false'" routerLink="/" [routerLinkActiveOptions]="{ exact : true }"
           routerLinkActive="active-link"
           class="item cursor-pointer rounded-left py-md-4 py-sm-1 button text-center border-bottom">
           <div>
diff --git a/src/app/stable-release/stable-release.component.html b/src/app/stable-release/stable-release.component.html
index 0d59a0f..d9fa8d1 100644
--- a/src/app/stable-release/stable-release.component.html
+++ b/src/app/stable-release/stable-release.component.html
@@ -1,23 +1,55 @@
 <div class="container-fluid bg-white h-100">
   <div class="row">
-    <div class="col-md-12 heading-row text-white py-2 mb-2">
-      <h4>CI/E2E Summary of OpeneEBS Release Pipelines</h4>
+    <div class="col-md-12 text-white py-2 mb-2"
+      [ngClass]="currentPlatform == 'openshift' ? 'red-gradient': 'grey-gradient'">
+      <!-- <h4>CI/E2E Summary of OpeneEBS Release Pipelines</h4> -->
+      <!-- </div>
+  </div> -->
+
+
+
+      <div class="row">
+        <div class="col-md-6">
+          <h4>CI/E2E Summary of OpeneEBS Release Pipelines</h4>
+        </div>
+      </div>
     </div>
   </div>
-  <div class="row">
+<div class="row">
+  <div class="col-md-5"></div>
+  <div class="col-md-7">
+    <div class="d-flex justify-content-center mb-2">
+      <div class="d-flex justify-content-between select-platform text-dark">
+        <div class="flex rounded shadow bg-white shadow-lg">
+          <div class="btn" [ngClass]="currentPlatform == 'openshift' ? 'btn-primary':'btn-disabled'"
+            (click)="checkoutPlatform('openshift')"><img src="/assets/images/cloud/openshift.png" alt="Platform-logo"
+              class="rounded-circle shadow" height="30px"><span class="mx-2">Openshift</span>
+          </div>
+          <div class="btn" [ngClass]="currentPlatform == 'konvoy' ? 'btn-primary' : 'btn-disabled'"
+            (click)="checkoutPlatform('konvoy')"><img src="/assets/images/cloud/konvoy.png" alt="Platform-logo"
+              class="rounded-circle shadow" height="30px"><span class="mx-2">Konvoy</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+
+  <div class="row" *ngIf='openshiftRelease.dashboard;else loadingSpinner'>
     <div class="col-md-7 table-pipelines-section">
       <table class="table" id="data">
         <thead>
           <th>Pipeline_ID</th>
           <th>Release_version</th>
-          <th class="text-center">Openshift 4.2</th>
+          <th class="text-center">{{getPlatformName(currentPlatform)}}</th>
         </thead>
         <tbody>
           <tr *ngFor="let pipeline of openshiftRelease.dashboard; let i = index"
             [ngClass]="{'row_color': i==rowCount()}" [attr.data-index]="i">
             <td><a href={{pipeline.web_url}} target="_blank">{{pipeline.id}}</a></td>
             <td>{{pipeline.release_tag}}</td>
-            <td class="text-center">
+            <td class="text-center cursor-pointer">
               <span [ngClass]="{'highlight': (status == 1 && i==rowCount())}" (click)="getJobDetails(pipeline,i)"
                 ngbTooltip="{{ pipelineTooltip(pipeline)}}" placement="right" class="pb-2">
                 <i *ngIf="pipelineTooltip(pipeline) == 'running';else donutSuccessFail"
@@ -47,9 +79,9 @@ <h4>CI/E2E Summary of OpeneEBS Release Pipelines</h4>
           <div class="col-md-12">
             <div class="d-flex justify-content-around">
               <div class="text-center">
-                <img src="/assets/images/cloud/openshift.png" alt="Openshift-logo" class="rounded-circle shadow"
-                  height="80px">
-                <h5 class="my-2">Openshift 4.2</h5>
+                <img src="/assets/images/cloud/{{currentPlatform}}.png" alt="Platform-logo"
+                  class="rounded-circle shadow" height="80px">
+                <h5 class="my-2">{{getPlatformName(currentPlatform)}}</h5>
               </div>
             </div>
           </div>
@@ -70,7 +102,8 @@ <h5 class="my-2">Openshift 4.2</h5>
           <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
             <div class="d-flex justify-content-around mt-2">
               <div>
-                <span class="font-weight-bold">Pipeliene #{{activePipeline.id}} </span><span>triggered {{activePipeline.triggered}} .</span>
+                <span class="font-weight-bold">Pipeliene #{{activePipeline.id}} </span><span>triggered
+                  {{activePipeline.triggered}} .</span>
               </div>
               <div>
                 <button type="button" class="rounded btn-outline-primary"> <i
@@ -155,7 +188,7 @@ <h5 class="my-2">Openshift 4.2</h5>
                           <div class="d-flex">
                             <div><i [ngClass]=statusIcon(job.status)></i></div>
                             <div class="job-link-line-right"></div>
-                            <div> <a href="https://gitlab.openebs.ci/openebs/e2e-openshift/-/jobs/{{job.id}}"
+                            <div> <a href="https://gitlab.openebs.ci/openebs/e2e-{{currentPlatform}}/-/jobs/{{job.id}}"
                                 target="_blank">
                                 <img src="/assets/images/workload-logo/gitlab-notxt.svg" alt="gitlab-logo"
                                   class="gitlab-job-image"></a>
@@ -176,4 +209,7 @@ <h5 class="my-2">Openshift 4.2</h5>
       </div>
     </div>
   </div>
+  <ng-template #loadingSpinner>
+    <app-lodding-spinners class="row"></app-lodding-spinners>
+  </ng-template>
 </div>
\ No newline at end of file
diff --git a/src/app/stable-release/stable-release.component.scss b/src/app/stable-release/stable-release.component.scss
index a2cb023..4254f3a 100644
--- a/src/app/stable-release/stable-release.component.scss
+++ b/src/app/stable-release/stable-release.component.scss
@@ -1,5 +1,27 @@
-.heading-row{
-  background-image: radial-gradient( circle farthest-corner at 12.3% 19.3%,  rgba(85,88,218,1) 0%, rgba(95,209,249,1) 100.2% );
+.heading-row {
+  background-image: radial-gradient(
+    circle farthest-corner at 12.3% 19.3%,
+    rgba(85, 88, 218, 1) 0%,
+    rgba(95, 209, 249, 1) 100.2%
+  );
+}
+.red-gradient {
+  background-image: radial-gradient(
+    circle farthest-corner at 12.3% 19.3%,
+    rgba(85, 88, 218, 1) 0%,
+    rgba(219, 33, 46, 0.6) 100.2%
+  );
+
+  // background: linear-gradient(90deg, rgba(219,33,46,1) 5%, rgba(255,255,255,1) 78%);
+}
+.grey-gradient {
+  background-image: radial-gradient(
+    circle farthest-corner at 12.3% 19.3%,
+    rgba(85, 88, 218, 1) 0%,
+    rgba(49, 2, 112, 0.6) 100.2%
+  );
+
+  // background: linear-gradient(90deg, #310270 5%, rgba(255,255,255,1) 78%);
 }
 .highlight {
   border-bottom: 5px solid #654cf9;
@@ -21,8 +43,8 @@ ul {
 .font-size-14 {
   font-size: 14px;
 }
-.font-size-25{
-  font-size:25px;
+.font-size-25 {
+  font-size: 25px;
 }
 .job-link-line-left {
   margin: 0;
@@ -56,28 +78,28 @@ ul {
   height: 25px;
   top: -3px;
 }
-.stage-jobs-content{
-  border-left: 1px solid #dee2e6 ;
+.stage-jobs-content {
+  border-left: 1px solid #dee2e6;
 }
-.stage-jobs-content:hover{
-border-color: #62b9f3;
+.stage-jobs-content:hover {
+  border-color: #62b9f3;
 }
 .job-row:hover {
   .job-name {
     color: #007bff;
   }
-  .job-link-line-right{
+  .job-link-line-right {
     border-top-color: #62b9f3;
   }
-  .job-link-line-left{
+  .job-link-line-left {
     border-top-color: #62b9f3;
   }
   i {
     text-shadow: 1px 1px 60px;
     font-weight: 900;
   }
-  img{
-    box-shadow:0px 250px 15px -35px rgba(0,0,0,.25);
+  img {
+    box-shadow: 0px 250px 15px -35px rgba(0, 0, 0, 0.25);
   }
 }
 
@@ -93,11 +115,18 @@ border-color: #62b9f3;
   background-image: none;
   border-color: #dfe3e9;
 }
-.table-pipelines-section{
+.table-pipelines-section {
   height: 90vh;
   overflow-y: auto;
 }
-.jobs-content-section{
+.jobs-content-section {
   height: 65vh;
   overflow-y: auto;
+}
+.cursor-pointer{
+  cursor: pointer;
+}
+
+.table{
+  table-layout: auto;
 }
\ No newline at end of file
diff --git a/src/app/stable-release/stable-release.component.ts b/src/app/stable-release/stable-release.component.ts
index 3d4d553..2f3bc6a 100644
--- a/src/app/stable-release/stable-release.component.ts
+++ b/src/app/stable-release/stable-release.component.ts
@@ -33,6 +33,7 @@ export class StableReleaseComponent implements OnInit {
   index: boolean = true;
   public initialCount: any = 0;
   detailPannelReady: boolean = false;
+  currentPlatform: any = 'openshift';
 
   ngOnInit() {
     localStorage.removeItem('rowop');
@@ -48,20 +49,45 @@ export class StableReleaseComponent implements OnInit {
       clickedCell.addClass("highlight");
     });
 
-    this.getData = timer(0, 10000).subscribe(x => {
-      this.DashboardDatas.getOpenshiftReleaseDetails().subscribe(res => {
-        this.openshiftRelease = res;
-        if (this.openshiftRelease) {
-          this.pageLoaded = true;
-          if (this.index){
+    this.checkoutPlatform("openshift");
+  }
+
+  checkoutPlatform(platform) {
+    if (platform !== this.currentPlatform) {
+      this.getData.unsubscribe();
+      this.index = true;
+    }
+    if (platform) {
+      this.currentPlatform = platform;
+      this.getData = timer(0, 10000).subscribe(x => {
+        this.DashboardDatas.getEndPointData(platform).subscribe(res => {
+          this.openshiftRelease = res;
+          if (this.openshiftRelease) {
+            this.pageLoaded = true;
+            if (this.index) {
               this.getJobDetails(this.openshiftRelease.dashboard[0], 0);
               this.index = false;
+            }
+
           }
-        }
-      });
-    })
-  }
+        });
+      })
+      // this.currentPlatform = platform;
+    } else {
+      console.error;
+    }
 
+  }
+  getPlatformName(platform) {
+    switch (platform) {
+      case 'openshift':
+        return 'Openshift 4.2'
+      case 'konvoy':
+        return 'Konvoy'
+      default:
+        break;
+    }
+  }
   ngOnDestroy() {
     this.getData.unsubscribe();
   }
@@ -91,32 +117,32 @@ export class StableReleaseComponent implements OnInit {
       }
       return hours + "h " + minutes + "m" + " ago";
     } catch (e) {
-      console.log("error",e);
+      console.log("error", e);
       return "_";
     }
   }
-  startedAt(data ){
+  startedAt(data) {
     try {
       var date = data.jobs[0].started_at
       var dateFormat = moment.utc(date, 'YYYY-M-DD,HH:mm:ss').local().calendar();
       return dateFormat;
     } catch (error) {
-      console.log("error",error);
+      console.log("error", error);
       return "_";
     }
   }
-  finishedAt(data ){
+  finishedAt(data) {
     try {
-      if (data.status == 'success' || data.status == 'failed'){
-      var date = data.jobs[data.jobs.length-1].finished_at
-      var dateFormat = moment.utc(date, 'YYYY-M-DD,HH:mm:ss').local().calendar();
-      return dateFormat;
-      }else{
+      if (data.status == 'success' || data.status == 'failed') {
+        var date = data.jobs[data.jobs.length - 1].finished_at
+        var dateFormat = moment.utc(date, 'YYYY-M-DD,HH:mm:ss').local().calendar();
+        return dateFormat;
+      } else {
         // Capatilize ref : https://www.freecodecamp.org/forum/t/how-to-capitalize-the-first-letter-of-a-string-in-javascript/18405
-        return data.status.charAt(0).toUpperCase()+data.status.slice(1);
+        return data.status.charAt(0).toUpperCase() + data.status.slice(1);
       }
     } catch (error) {
-      console.log("error",error);
+      console.log("error", error);
       return "_";
     }
   }
@@ -124,7 +150,7 @@ export class StableReleaseComponent implements OnInit {
   duration(data) {
     try {
       var startedAt = moment(data.jobs[0].started_at, 'YYYY-M-DD,HH:mm:ss');
-      var finishedAt = moment(data.jobs[data.jobs.length-1].finished_at, 'YYYY-M-DD,HH:mm:ss');
+      var finishedAt = moment(data.jobs[data.jobs.length - 1].finished_at, 'YYYY-M-DD,HH:mm:ss');
       var difference = moment.duration((finishedAt.diff(startedAt, 'second')), "second");
       var days = difference.days();
       var hours = difference.hours();
@@ -157,11 +183,11 @@ export class StableReleaseComponent implements OnInit {
       jobs: pipeline.jobs.length,
       successJobs: this.passed(pipeline.jobs),
       failedJobs: this.failed(pipeline.jobs),
-      triggered : this.triggered(pipeline),
+      triggered: this.triggered(pipeline),
       startedAt: this.startedAt(pipeline),
       finishedAt: this.finishedAt(pipeline),
       duration: this.duration(pipeline)
-    }    
+    }
     var stages = [];
     var obj = [];
     pipeline.jobs.forEach(job => {
diff --git a/src/app/table/table.component.html b/src/app/table/table.component.html
index 3f42d46..16539bd 100644
--- a/src/app/table/table.component.html
+++ b/src/app/table/table.component.html
@@ -23,9 +23,9 @@
             <h3 class="text-white"></h3>
             <h4 class=" d-none d-md-block font-size-32 text-left">CI/E2E Summary of OpenEBS Development Builds</h4>
             <div class="d-block d-md-none text-dark">CI/E2E Summary of OpenEBS Development Builds</div>
-            <h3 *ngIf="undefined !== buildData" class="text-white font-size-15">Builds in last one week:
+            <!-- <h3 *ngIf="undefined !== buildData" class="text-white font-size-15">Builds in last one week:
               {{ masterBuildsCount(buildData.dashboard) }}
-            </h3>
+            </h3> -->
           </a>
         </li>
       </ul>
@@ -35,56 +35,33 @@ <h3 *ngIf="undefined !== buildData" class="text-white font-size-15">Builds in la
           <table id="data" class="table table-borderless">
             <thead>
               <tr class="text-center">
-                <th>Trigger</th>
                 <th>Build</th>
                 <th class="text-center">E2E Pipelines</th>
               </tr>
               <tr class="text-center">
-                <td></td>
                 <td></td>
                 <td class="d-flex align-items-center justify-content-center platform">
                   <span class="mx-4"><img class="p-0" height="30" src="/assets/images/company-logos/k8s.png">
-                    <p class="font-size-13">1.14.5</p>
-                  </span>
-                  <span class="mx-4"><img class="p-0" height="30" src="/assets/images/company-logos/k8s.png">
-                    <p class="font-size-13">1.15.3</p>
+                    <p class="font-size-13">1.15.2</p>
                   </span>
                   <span class="mx-4"><img class="p-0" height="30" src="/assets/images/company-logos/k8s.png">
                     <p class="font-size-13">1.16.1</p>
                   </span>
-                  <span class="mx-2"><img class="p-0" height="30" src="/assets/images/cloud/D2IQ.svg">
-                    <p class="font-size-13">Konvoy(1.15.5)</p>
+                  <span class="mx-4"><img class="p-0" height="30" src="/assets/images/company-logos/k8s.png">
+                    <p class="font-size-13">1.17.2</p>
                   </span>
-
                 </td>
               </tr>
             </thead>
-            <tbody *ngIf="undefined !== (packetV15Data && buildData && packetV14Data && packetV13Data)">
+            <tbody *ngIf="undefined !== (packetV15Data && packetV14Data && packetV13Data)">
               <tr [ngClass]="{'row_color': i==rowCount()}" class="text-center"
-                *ngFor="let post of buildData.dashboard; let i = index" [attr.data-index]="i">
-                <td>
-                  <a class="github-commit" href="{{pullRequestURL(buildData.dashboard[i])}}" target="_blank">
-                    <span>{{ getCommitName(i, buildData.dashboard) }}</span> <span class="d-none d-md-inline">
-                      /#{{ getCommit(i, buildData.dashboard) | slice:0:8 }}</span>
-                  </a>
-                  <p class="font-size-12 d-none d-md-block">Commit: {{ updated(i, buildData.dashboard) }}</p>
-                </td>
-
+                *ngFor="let post of packetV15Data.dashboard; let i = index" [attr.data-index]="i">
                 <td>
-                  <button placement="bottom" ngbTooltip="{{buildTooltip(i, buildData.dashboard)}}"
-                    [ngClass]="buttonStatusClass(buildStatus(i, buildData.dashboard))"
-                    (click)="clickit(buildWeburl(i, buildData.dashboard)); detailPannel(i, packetV13.dashboard, buildData.dashboard, 'packetV14'); ">
-                    <i class="font-size-13" [ngClass]="iconClass(buildStatus(i, buildData.dashboard))"></i>
-                    <a class="ml-1 font-size-15 d-none d-md-inline">{{buildStatus(i, buildData.dashboard)}}</a>
-                  </button>
+                  ci
                 </td>
-
                 <td class="d-flex justify-content-center">
-                  <!--                     style=" padding-bottom:10px;margin-left:31.9px; margin-right:31.9px;cursor:pointer"
- -->
-
                   <span placement="bottom" ngbTooltip="{{ pipelineTooltip(i, packetV13Data.dashboard) }}"
-                    (click)="detailPannel(i, packetV13Data.dashboard, buildData.dashboard, 'packetv14');"
+                    (click)="detailPannel(i, packetV13Data.dashboard, 'packetv14');"
                     [ngClass]="{'highlight': (status == 1 && i==rowCount())}"
                     [ngStyle]="{'pointer-events': pipelineTooltip(i, packetV13Data.dashboard) === 'pending' ? 'none' : 'initial' }"
                     style=" padding-bottom:10px;margin-left:31.9px; margin-right:31.9px;cursor:pointer">
@@ -117,7 +94,7 @@ <h3 *ngIf="undefined !== buildData" class="text-white font-size-15">Builds in la
                   </span>
 
                   <span placement="bottom" ngbTooltip="{{ pipelineTooltip(i, packetV14Data.dashboard) }}"
-                    (click)="detailPannel(i, packetV14Data.dashboard, buildData.dashboard, 'packetv15');"
+                    (click)="detailPannel(i, packetV14Data.dashboard, 'packetv15');"
                     [ngClass]="{'highlight': (status == 2 && i==rowCount())}"
                     [ngStyle]="{'pointer-events': pipelineTooltip(i, packetV14Data.dashboard) === 'pending' ? 'none' : 'initial' }"
                     style=" padding-bottom:10px;margin-left:31.9px; margin-right:31.9px;cursor:pointer">
@@ -150,7 +127,7 @@ <h3 *ngIf="undefined !== buildData" class="text-white font-size-15">Builds in la
                   </span>
 
                   <span placement="bottom" ngbTooltip="{{ pipelineTooltip(i, packetV15Data.dashboard) }}"
-                    (click)="detailPannel(i, packetV15Data.dashboard, buildData.dashboard, 'packetv16');"
+                    (click)="detailPannel(i, packetV15Data.dashboard, 'packetv16');"
                     [ngClass]="{'highlight': (status == 3 && i==rowCount())}"
                     [ngStyle]="{'pointer-events': pipelineTooltip(i, packetV15Data.dashboard) === 'pending' ? 'none' : 'initial' }"
                     style=" padding-bottom:10px;margin-left:31.9px; margin-right:31.9px;cursor:pointer">
@@ -181,39 +158,6 @@ <h3 *ngIf="undefined !== buildData" class="text-white font-size-15">Builds in la
                       </ng-template>
                     </ng-template>
                   </span>
-
-                  <span placement="bottom" ngbTooltip="{{ pipelineTooltip(i, konvoyData.dashboard) }}"
-                    (click)="detailPannel(i, konvoyData.dashboard, buildData.dashboard, 'konvoy');"
-                    [ngClass]="{'highlight': (status == 4 && i==rowCount())}"
-                    [ngStyle]="{'pointer-events': pipelineTooltip(i, konvoyData.dashboard) === 'pending' ? 'none' : 'initial' }"
-                    style=" padding-bottom:10px;margin-left:31.9px; margin-right:31.9px;cursor:pointer">
-                    <i *ngIf="pipelineTooltip(i, konvoyData.dashboard) == 'running';else errorGraphkonvoy"
-                      class='fa fa-circle-o-notch btn-txt fa-spin btn-outline-primary pipeline-status-icon'></i>
-                    <ng-template #errorGraphkonvoy>
-                      <i *ngIf="pipelineTooltip(i, konvoyData.dashboard) == '';else statusGraphkonvoy"
-                        class='fa fa-ban text-dark pipeline-status-icon'></i>
-                      <ng-template #statusGraphkonvoy>
-                        <i *ngIf="pipelineTooltip(i, konvoyData.dashboard) == 'pending';else cancelGraphKonvoy"
-                          class='fas fa-exclamation-triangle btn-txt btn-outline-warning pipeline-status-icon'></i>
-                        <ng-template #cancelGraphKonvoy>
-                          <i *ngIf="pipelineTooltip(i, konvoyData.dashboard) == 'cancelled';else statusSuccessGraphkonvoy"
-                            class='fas fa-minus-circle  btn-txt pipeline-status-icon padding-top-3'></i>
-                          <ng-template #statusSuccessGraphkonvoy>
-                            <svg width="20" height="20" viewBox="0 0 42 42" class="donut">
-                              <circle class="donut-hole" cx="21" cy="21" r="15.91549430918954" fill="#fff"></circle>
-                              <circle class="donut-ring" cx="21" cy="21" r="15.91549430918954" fill="transparent"
-                                stroke="#ff0000" stroke-width="6" stroke-dasharray="95 5" stroke-dashoffset="22.5">
-                              </circle>
-                              <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent"
-                                stroke="#009400" stroke-width="6"
-                                [attr.stroke-dasharray]="getJobPercentFromPipeline(i, konvoyData.dashboard)"
-                                stroke-dashoffset="22.5"></circle>
-                            </svg>
-                          </ng-template>
-                        </ng-template>
-                      </ng-template>
-                    </ng-template>
-                  </span>
                 </td>
               </tr>
             </tbody>
diff --git a/src/app/table/table.component.ts b/src/app/table/table.component.ts
index 34a884f..04bf161 100644
--- a/src/app/table/table.component.ts
+++ b/src/app/table/table.component.ts
@@ -81,31 +81,23 @@ export class TableComponent implements OnInit {
     });
 
     this.getData = timer(0, 5000).subscribe(x => {
-      this.DashboardDatas.getPacketv15Details().subscribe(data => {
-        this.showSpinnerTable = false;
-        this.packetV15Data = data;
-      });
-      this.DashboardDatas.getPacketv14Details().subscribe(data => {
-        this.showSpinnerTable = false;
-        this.packetV14Data = data;
-      });
-      this.DashboardDatas.getPacketv13Details().subscribe(data => {
+      this.DashboardDatas.getEndPointData("packet-antepenultimate").subscribe(data => {
         this.showSpinnerTable = false;
         this.packetV13Data = data;
       });
-      this.DashboardDatas.getKonvoyDetails().subscribe(data => {
+      this.DashboardDatas.getEndPointData("packet-penultimate").subscribe(data => {
         this.showSpinnerTable = false;
-        this.konvoyData = data;
+        this.packetV14Data = data;
       });
-      this.DashboardDatas.getBuildDetails().subscribe(data => {
+      this.DashboardDatas.getEndPointData("packet-ultimate").subscribe(data => {
         this.showSpinnerTable = false;
-        this.buildData = data;
+        this.packetV15Data = data;
       });
     });
     this.selectCell = timer(0, 1000).subscribe(x => {
-      if (this.index == 1 && this.buildData != undefined && this.packetV13Data != undefined) {
+      if (this.index == 1 && this.packetV13Data != undefined) {
         this.index = 0;
-        this.detailPannel(0, this.packetV13Data.dashboard, this.buildData.dashboard, 'packetv14');
+        this.detailPannel(0, this.packetV13Data.dashboard, 'packetv14');
       }
     });
   }
@@ -343,7 +335,7 @@ export class TableComponent implements OnInit {
     return failed;
   }
 
-  detailPannel(index, pipelineData, buildData, cloud) {
+  detailPannel(index, pipelineData, cloud) {
     this.pipelineDetailStatus = false;
     this.showSpinnerDetails = true;
     setTimeout(() => {
@@ -357,33 +349,33 @@ export class TableComponent implements OnInit {
         this.name = "PACKET";
         this.kubernetesVersion = "1.15.3";
         this.status = 2;
-        this.detailsDatas(index, pipelineData, buildData)
+        this.detailsDatas(index, pipelineData)
       } else if (cloud == "packetv14") {
         this.image = 'packet.svg'
         this.name = "PACKET";
         this.kubernetesVersion = "1.14.5";
         this.status = 1;
-        this.detailsDatas(index, pipelineData, buildData)
+        this.detailsDatas(index, pipelineData)
       } else if (cloud == "packetv16") {
         this.image = 'packet.svg'
         this.name = "PACKET";
         this.kubernetesVersion = "1.16.1";
         this.status = 3;
-        this.detailsDatas(index, pipelineData, buildData)
+        this.detailsDatas(index, pipelineData)
       } else if (cloud == "konvoy") {
         this.image = 'D2IQ.svg'
         this.name = "KONVOY";
         this.kubernetesVersion = "1.15.5";
         this.status = 4;
-        this.detailsDatas(index, pipelineData, buildData)
+        this.detailsDatas(index, pipelineData)
       }
     }
   }
 
-  detailsDatas(index, pipelineData, buildData) {
-    this.commitMessage = buildData[index].jobs[0].message;
-    this.pullRequest = this.pullRequestURL(buildData[index])
-    this.commitUser = this.commitUsr(buildData[index].jobs[0].author_name, pipelineData[index].sha);
+  detailsDatas(index, pipelineData) {
+    // this.commitMessage = buildData[index].jobs[0].message;
+    // this.pullRequest = this.pullRequestURL(buildData[index])
+    // this.commitUser = this.commitUsr(buildData[index].jobs[0].author_name, pipelineData[index].sha);
     this.rating = this.ratingCalculation(pipelineData[index].jobs)
     this.gitlabPipelineUrl = this.gitlabPipelineURL(pipelineData[index].web_url);
     this.log_url = pipelineData[index].kibana_url;
diff --git a/src/assets/images/cloud/konvoy.png b/src/assets/images/cloud/konvoy.png
new file mode 100644
index 0000000000000000000000000000000000000000..c42d6a64e20d9f9dcd97de77b862be6922a0ac2b
GIT binary patch
literal 15099
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

literal 0
HcmV?d00001


From 2e47fbb75317d2fa23bf053fa126db734baf68e1 Mon Sep 17 00:00:00 2001
From: bhaskarhc <hcbhaskar7@gmail.com>
Date: Wed, 29 Jan 2020 12:35:07 +0530
Subject: [PATCH 2/5] remove unused/commented code

Signed-off-by: bhaskarhc <hcbhaskar7@gmail.com>
---
 src/app/stable-release/stable-release.component.ts | 5 +----
 src/app/table/table.component.html                 | 3 ---
 src/app/table/table.component.ts                   | 3 ---
 3 files changed, 1 insertion(+), 10 deletions(-)

diff --git a/src/app/stable-release/stable-release.component.ts b/src/app/stable-release/stable-release.component.ts
index 2f3bc6a..cce2290 100644
--- a/src/app/stable-release/stable-release.component.ts
+++ b/src/app/stable-release/stable-release.component.ts
@@ -72,9 +72,8 @@ export class StableReleaseComponent implements OnInit {
           }
         });
       })
-      // this.currentPlatform = platform;
     } else {
-      console.error;
+      console.error('Unable to find Selected Platform');
     }
 
   }
@@ -84,8 +83,6 @@ export class StableReleaseComponent implements OnInit {
         return 'Openshift 4.2'
       case 'konvoy':
         return 'Konvoy'
-      default:
-        break;
     }
   }
   ngOnDestroy() {
diff --git a/src/app/table/table.component.html b/src/app/table/table.component.html
index 16539bd..e76d3de 100644
--- a/src/app/table/table.component.html
+++ b/src/app/table/table.component.html
@@ -23,9 +23,6 @@
             <h3 class="text-white"></h3>
             <h4 class=" d-none d-md-block font-size-32 text-left">CI/E2E Summary of OpenEBS Development Builds</h4>
             <div class="d-block d-md-none text-dark">CI/E2E Summary of OpenEBS Development Builds</div>
-            <!-- <h3 *ngIf="undefined !== buildData" class="text-white font-size-15">Builds in last one week:
-              {{ masterBuildsCount(buildData.dashboard) }}
-            </h3> -->
           </a>
         </li>
       </ul>
diff --git a/src/app/table/table.component.ts b/src/app/table/table.component.ts
index 04bf161..2f6c09a 100644
--- a/src/app/table/table.component.ts
+++ b/src/app/table/table.component.ts
@@ -373,9 +373,6 @@ export class TableComponent implements OnInit {
   }
 
   detailsDatas(index, pipelineData) {
-    // this.commitMessage = buildData[index].jobs[0].message;
-    // this.pullRequest = this.pullRequestURL(buildData[index])
-    // this.commitUser = this.commitUsr(buildData[index].jobs[0].author_name, pipelineData[index].sha);
     this.rating = this.ratingCalculation(pipelineData[index].jobs)
     this.gitlabPipelineUrl = this.gitlabPipelineURL(pipelineData[index].web_url);
     this.log_url = pipelineData[index].kibana_url;

From 2da67ba9e9a10a1ea3e324abdde03c2e0ccfc6c7 Mon Sep 17 00:00:00 2001
From: bhaskarhc <hcbhaskar7@gmail.com>
Date: Wed, 29 Jan 2020 12:49:05 +0530
Subject: [PATCH 3/5] remove commented code

---
 src/app/stable-release/stable-release.component.html | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/src/app/stable-release/stable-release.component.html b/src/app/stable-release/stable-release.component.html
index d9fa8d1..0b7c867 100644
--- a/src/app/stable-release/stable-release.component.html
+++ b/src/app/stable-release/stable-release.component.html
@@ -2,12 +2,6 @@
   <div class="row">
     <div class="col-md-12 text-white py-2 mb-2"
       [ngClass]="currentPlatform == 'openshift' ? 'red-gradient': 'grey-gradient'">
-      <!-- <h4>CI/E2E Summary of OpeneEBS Release Pipelines</h4> -->
-      <!-- </div>
-  </div> -->
-
-
-
       <div class="row">
         <div class="col-md-6">
           <h4>CI/E2E Summary of OpeneEBS Release Pipelines</h4>
@@ -34,8 +28,6 @@ <h4>CI/E2E Summary of OpeneEBS Release Pipelines</h4>
     </div>
   </div>
 </div>
-
-
   <div class="row" *ngIf='openshiftRelease.dashboard;else loadingSpinner'>
     <div class="col-md-7 table-pipelines-section">
       <table class="table" id="data">
@@ -202,10 +194,7 @@ <h5 class="my-2">{{getPlatformName(currentPlatform)}}</h5>
               </div>
             </div>
           </div>
-
         </div>
-
-
       </div>
     </div>
   </div>

From 270e087c1f77f57b86a09eac9bfc74470e0ef617 Mon Sep 17 00:00:00 2001
From: bhaskarhc <hcbhaskar7@gmail.com>
Date: Thu, 30 Jan 2020 12:14:52 +0530
Subject: [PATCH 4/5] nav button position change

Signed-off-by: bhaskarhc <hcbhaskar7@gmail.com>
---
 src/app/stable-release/stable-release.component.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/app/stable-release/stable-release.component.html b/src/app/stable-release/stable-release.component.html
index 0b7c867..ae83e49 100644
--- a/src/app/stable-release/stable-release.component.html
+++ b/src/app/stable-release/stable-release.component.html
@@ -10,7 +10,7 @@ <h4>CI/E2E Summary of OpeneEBS Release Pipelines</h4>
     </div>
   </div>
 <div class="row">
-  <div class="col-md-5"></div>
+  <!-- <div class="col-md-5"></div> -->
   <div class="col-md-7">
     <div class="d-flex justify-content-center mb-2">
       <div class="d-flex justify-content-between select-platform text-dark">

From a18c22b22be6a891230b4ebe5ae8b55bc1606f36 Mon Sep 17 00:00:00 2001
From: bhaskarhc <hcbhaskar7@gmail.com>
Date: Thu, 30 Jan 2020 12:39:42 +0530
Subject: [PATCH 5/5] add analytics

Signed-off-by: bhaskarhc <hcbhaskar7@gmail.com>
---
 src/index.html | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/index.html b/src/index.html
index 4e62868..a44776d 100644
--- a/src/index.html
+++ b/src/index.html
@@ -88,6 +88,21 @@
 
 <body style=" background-color: #EFF2F6; font-family: sans-serif;overflow-x: hidden;overflow-y: scroll;">
     <app-root>
+        <script>
+            (function(i, s, o, g, r, a, m) {
+                      i['GoogleAnalyticsObject'] = r;
+                      i[r] = i[r] || function() {
+                          (i[r].q = i[r].q || []).push(arguments)
+                      }, i[r].l = 1 * new Date();
+                      a = s.createElement(o),
+                          m = s.getElementsByTagName(o)[0];
+                      a.async = 1;
+                      a.src = g;
+                      m.parentNode.insertBefore(a, m)
+                  })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
+          ga('create', 'UA-157359467-1', 'auto');// add your tracking ID here.
+          ga('send', 'pageview');
+          </script>
         <!-- loading layout replaced by app after startup -->
         <div class="app-loading">
             <div class="logo">