diff --git a/make/photon/portal/Dockerfile b/make/photon/portal/Dockerfile index 39b458679..04834e9b5 100644 --- a/make/photon/portal/Dockerfile +++ b/make/photon/portal/Dockerfile @@ -15,6 +15,7 @@ COPY ./api/v2.0/legacy_swagger.yaml /build_dir/swagger.yaml COPY ./api/v2.0/swagger.yaml /build_dir/swagger2.yaml RUN python -c 'import sys, yaml, json; y=yaml.load(sys.stdin.read()); print json.dumps(y)' < swagger.yaml > swagger.json +RUN python -c 'import sys, yaml, json; y=yaml.load(sys.stdin.read()); print json.dumps(y)' < swagger2.yaml > swagger2.json COPY ./LICENSE /build_dir COPY src/portal /build_dir @@ -28,6 +29,7 @@ FROM goharbor/harbor-portal-base:${harbor_base_image_version} COPY --from=nodeportal /build_dir/dist /usr/share/nginx/html COPY --from=nodeportal /build_dir/swagger.yaml /usr/share/nginx/html COPY --from=nodeportal /build_dir/swagger.json /usr/share/nginx/html +COPY --from=nodeportal /build_dir/swagger2.json /usr/share/nginx/html COPY --from=nodeportal /build_dir/LICENSE /usr/share/nginx/html COPY make/photon/portal/nginx.conf /etc/nginx/nginx.conf diff --git a/src/portal/src/app/dev-center/dev-center.component.ts b/src/portal/src/app/dev-center/dev-center.component.ts index 9a662f09e..4bb5a52fa 100644 --- a/src/portal/src/app/dev-center/dev-center.component.ts +++ b/src/portal/src/app/dev-center/dev-center.component.ts @@ -1,12 +1,18 @@ import { AfterViewInit, Component, ElementRef, OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; -import { throwError as observableThrowError, Observable } from 'rxjs'; -import { catchError, map } from 'rxjs/operators'; +import { throwError as observableThrowError, forkJoin } from 'rxjs'; +import { catchError } from 'rxjs/operators'; import { Title } from '@angular/platform-browser'; import { TranslateService } from '@ngx-translate/core'; import { CookieService } from "ngx-cookie"; +import * as SwaggerUI from 'swagger-ui'; +import { mergeDeep } from "../../lib/utils/utils"; + +enum SwaggerJsonUrls { + SWAGGER1 = '/swagger.json', + SWAGGER2 = '/swagger2.json' +} -const SwaggerUI = require('swagger-ui'); @Component({ selector: 'dev-center', templateUrl: 'dev-center.component.html', @@ -15,8 +21,6 @@ const SwaggerUI = require('swagger-ui'); }) export class DevCenterComponent implements AfterViewInit, OnInit { private ui: any; - private host: any; - private json: any; constructor( private el: ElementRef, private http: HttpClient, @@ -48,13 +52,15 @@ export class DevCenterComponent implements AfterViewInit, OnInit { } } }; - this.http.get("/swagger.json") + forkJoin([this.http.get(SwaggerJsonUrls.SWAGGER1), this.http.get(SwaggerJsonUrls.SWAGGER2)]) .pipe(catchError(error => observableThrowError(error))) - .subscribe(json => { + .subscribe(jsonArr => { + const json: object = {}; + mergeDeep(json, jsonArr[0], jsonArr[1]); json['host'] = window.location.host; const protocal = window.location.protocol; json['schemes'] = [protocal.replace(":", "")]; - let ui = SwaggerUI({ + this.ui = SwaggerUI({ spec: json, domNode: this.el.nativeElement.querySelector('.swagger-container'), deepLinking: true, diff --git a/src/portal/src/app/project/repository/artifact/artifact-additions/values/values.component.ts b/src/portal/src/app/project/repository/artifact/artifact-additions/values/values.component.ts index 9e6776d43..c8c83d539 100644 --- a/src/portal/src/app/project/repository/artifact/artifact-additions/values/values.component.ts +++ b/src/portal/src/app/project/repository/artifact/artifact-additions/values/values.component.ts @@ -8,6 +8,7 @@ import { AdditionLink } from "../../../../../../../ng-swagger-gen/models/additio import { ErrorHandler } from "../../../../../../lib/utils/error-handler"; import * as yaml from "js-yaml"; import { finalize } from "rxjs/operators"; +import { isObject } from "../../../../../../lib/utils/utils"; @Component({ selector: "hbr-artifact-values", @@ -84,7 +85,7 @@ export class ValuesComponent implements OnInit { format(obj: object) { for (let name in obj) { if (obj.hasOwnProperty(name)) { - if (obj[name] instanceof Object) { + if (isObject(obj[name])) { for (let key in obj[name]) { if (obj[name].hasOwnProperty(key)) { obj[`${name}.${key}`] = obj[name][key]; diff --git a/src/portal/src/app/project/repository/artifact/artifact-common-properties/artifact-common-properties.component.ts b/src/portal/src/app/project/repository/artifact/artifact-common-properties/artifact-common-properties.component.ts index 93858ef6d..9b21e46a3 100644 --- a/src/portal/src/app/project/repository/artifact/artifact-common-properties/artifact-common-properties.component.ts +++ b/src/portal/src/app/project/repository/artifact/artifact-common-properties/artifact-common-properties.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/cor import { DatePipe } from "@angular/common"; import { TranslateService } from "@ngx-translate/core"; import { Artifact } from "../../../../../../ng-swagger-gen/models/artifact"; -import { formatSize } from "../../../../../lib/utils/utils"; +import { isObject } from "../../../../../lib/utils/utils"; enum Types { CREATED = 'created', @@ -36,7 +36,7 @@ export class ArtifactCommonPropertiesComponent implements OnInit, OnChanges { Object.assign(this.commonProperties, this.artifactDetails.extra_attrs); for (let name in this.commonProperties) { if (this.commonProperties.hasOwnProperty(name)) { - if (this.commonProperties[name] && this.commonProperties[name] instanceof Object) { + if (isObject(this.commonProperties[name])) { this.commonProperties[name] = JSON.stringify(this.commonProperties[name]); } if (name === Types.CREATED) { diff --git a/src/portal/src/app/project/repository/vulnerability-scanning/result-bar-chart.component.ts b/src/portal/src/app/project/repository/vulnerability-scanning/result-bar-chart.component.ts index 6306bb6fd..3db527016 100644 --- a/src/portal/src/app/project/repository/vulnerability-scanning/result-bar-chart.component.ts +++ b/src/portal/src/app/project/repository/vulnerability-scanning/result-bar-chart.component.ts @@ -51,7 +51,6 @@ export class ResultBarChartComponent implements OnInit, OnDestroy { ) { } ngOnInit(): void { - if ((this.status === VULNERABILITY_SCAN_STATUS.RUNNING || this.status === VULNERABILITY_SCAN_STATUS.PENDING) && !this.stateCheckTimer) { @@ -188,7 +187,7 @@ export class ResultBarChartComponent implements OnInit, OnDestroy { this.summary = clone(newVal); } viewLog(): string { - return `${ CURRENT_BASE_HREF }/projects/${this.projectName}/repositories/${this.repoName} - /artifacts/${this.artifactDigest}/scan/${this.summary.report_id}/log`; + return `${ CURRENT_BASE_HREF }/projects/${this.projectName + }/repositories/${this.repoName}/artifacts/${this.artifactDigest}/scan/${this.summary.report_id}/log`; } } diff --git a/src/portal/src/lib/utils/utils.ts b/src/portal/src/lib/utils/utils.ts index a684cbc25..ef829a521 100644 --- a/src/portal/src/lib/utils/utils.ts +++ b/src/portal/src/lib/utils/utils.ts @@ -597,3 +597,34 @@ export function formatSize(tagSize: string): string { return size + "B"; } } + +/** + * Simple object check. + * @param item + * @returns {boolean} + */ +export function isObject(item): boolean { + return (item && typeof item === 'object' && !Array.isArray(item)); +} + +/** + * Deep merge two objects. + * @param target + * @param ...sources + */ +export function mergeDeep(target, ...sources) { + if (!sources.length) { return target; } + const source = sources.shift(); + + if (isObject(target) && isObject(source)) { + for (const key in source) { + if (isObject(source[key])) { + if (!target[key]) { Object.assign(target, { [key]: {} }); } + mergeDeep(target[key], source[key]); + } else { + Object.assign(target, { [key]: source[key] }); + } + } + } + return mergeDeep(target, ...sources); +}