Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • ssa/workspaces
1 result
Show changes
Commits on Source (4)
Showing
with 132 additions and 122 deletions
......@@ -66,9 +66,12 @@ services/capability/workflow.log
services/workflow/workflow.log
services/notification/notification.log
**/.coverage
**/htmlcov
**/coverage.xml
**/coverage.json
pyproject.toml
# Ignore docker volume mount points
services/**/**/apps
services/**/**/shared
services/**/**/test
services/**/**/testing
......@@ -3,6 +3,7 @@ stages:
- push-base
- build-dev
- unit-test-dev
- test-coverage
- push-dev
- clean-images
# - deploy-dev
......@@ -96,6 +97,26 @@ unit test dev notification:
needs:
- build dev notification
# disabled stage
.unit test coverage:
stage: test-coverage
before_script:
-
variables:
SERVICE_NAME_1: "capability"
SERVICE_NAME_2: "workflow"
SERVICE_NAME_3: "notification"
CONTAINER_NAME_1: ${SERVICE_NAME_1}_${CI_COMMIT_SHORT_SHA}
CONTAINER_NAME_2: ${SERVICE_NAME_2}_${CI_COMMIT_SHORT_SHA}
CONTAINER_NAME_2: ${SERVICE_NAME_3}_${CI_COMMIT_SHORT_SHA}
script:
- docker container run --name ${CONTAINER_NAME_1} ${REGISTRY_URL}/${PROJECT_NAME}/${SERVICE_NAME_1}:${CI_COMMIT_SHORT_SHA} ./bin/run-tests.sh -cr xml -o ${SERVICE_NAME_1}.xml
- docker container run --name ${CONTAINER_NAME_2} ${REGISTRY_URL}/${PROJECT_NAME}/${SERVICE_NAME_2}:${CI_COMMIT_SHORT_SHA} ./bin/run-tests.sh -cr xml -o ${SERVICE_NAME_2}.xml
- docker container run --name ${CONTAINER_NAME_3} ${REGISTRY_URL}/${PROJECT_NAME}/${SERVICE_NAME_3}:${CI_COMMIT_SHORT_SHA} ./bin/run-tests.sh -cr xml -o ${SERVICE_NAME_3}.xml
- docker cp ${CONTAINER_NAME_1}:coverage.xml ./${CONTAINER_NAME_1}.xml
- docker cp ${CONTAINER_NAME_2}:coverage.xml ./${CONTAINER_NAME_2}.xml
- docker cp ${CONTAINER_NAME_3}:coverage.xml ./${CONTAINER_NAME_3}.xml
# Push Stages
push dev workflow:
stage: push-dev
......@@ -127,18 +148,27 @@ clean build workflow:
variables:
SERVICE_NAME: "workflow"
extends: .cleanup
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_MESSAGE =~ /\A(?i)-debug/'
when: never
clean build capability:
stage: clean-images
variables:
SERVICE_NAME: "capability"
extends: .cleanup
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_MESSAGE =~ /\A(?i)-debug/'
when: never
clean build notification:
stage: clean-images
variables:
SERVICE_NAME: "notification"
extends: .cleanup
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_MESSAGE =~ /\A(?i)-debug/'
when: never
# Deploy Stages
......
......@@ -24,6 +24,14 @@ test:
.PHONY: dev
dev: docker-base
.PHONY: setup
setup:
docker exec workspaces_capability_1 /bin/bash -c 'python -m pip install -r requirements.txt'
docker exec workspaces_capability_1 /bin/bash -c 'python -m pip install -e .'
docker exec workspaces_workflow_1 /bin/bash -c 'python -m pip install -e .'
docker exec workspaces_notification_1 /bin/bash -c 'python -m pip install -e .'
docker-compose restart
.PHONY: alembic-update
alembic-update:
cd schema; \
......
......@@ -26,11 +26,13 @@ Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protrac
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
## Archive Config
## Environment Config
Configuration variables can be set in the env.js file located next to the index.html file. These variables will be loaded into the angular app through the EnvService.
Configuration variables can be set in `src/environments` directory.
The env.js file can be modified without having to rebuild the application.
To use a configuration in a build, run `ng build --c=production` or `ng build --c=test`.
To use a configuration locally, run `ng serve --c=production` or `ng serve --c=test`.
## Search Filters
......
......@@ -59,6 +59,30 @@
"maximumError": "5mb"
}
]
},
"test": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.test.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}
]
}
}
},
......@@ -70,6 +94,9 @@
"configurations": {
"production": {
"browserTarget": "archive2:build:production"
},
"test": {
"browserTarget": "archive2:build:test"
}
}
},
......
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ReactiveFormsModule} from "@angular/forms";
import { NgModule } from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {ReactiveFormsModule} from "@angular/forms";
import {NgModule} from '@angular/core';
import {HttpClientModule} from "@angular/common/http";
import { AppComponent } from './app.component';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { EnvServiceProvider} from "./env/env.service.provider";
import { WebAnalyticsService } from "./web-analytics/web-analytics.service";
import {AppComponent} from './app.component';
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
import {WebAnalyticsService} from "./web-analytics/web-analytics.service";
import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
import {HeaderComponent} from './header/header.component';
import {FooterComponent} from './footer/footer.component';
import { AppRoutingModule } from './app-routing.module';
import { SplashComponent } from './splash/splash.component';
import { SharedModule } from "./shared/shared.module";
import {AppRoutingModule} from './app-routing.module';
import {SplashComponent} from './splash/splash.component';
import {SharedModule} from "./shared/shared.module";
@NgModule({
declarations: [
......@@ -33,7 +32,7 @@ import { SharedModule } from "./shared/shared.module";
HttpClientModule,
SharedModule
],
providers: [EnvServiceProvider, WebAnalyticsService],
providers: [WebAnalyticsService],
bootstrap: [AppComponent]
})
export class AppModule {
......
import {Injectable} from '@angular/core';
import {ResultType} from "../model/result-type";
import {BehaviorSubject, Observable} from "rxjs";
import {HttpClient} from "@angular/common/http";
import {EnvService} from "../../env/env.service";
@Injectable({
providedIn: 'root'
......@@ -13,11 +11,7 @@ export class ResultTypeService {
private _resultType: BehaviorSubject<ResultType> = new BehaviorSubject(this.resultType);
public readonly resultType$: Observable<ResultType> = this._resultType.asObservable();
private serverAddress: string = '';
constructor(private http: HttpClient, private env: EnvService) {
this.serverAddress = env.apiUrl;
}
constructor() {}
updateResultType(name: string): void {
this.resultType = ResultType.getResultType(name);
......
import { Injectable } from '@angular/core';
import {Injectable} from '@angular/core';
import {HttpClient, HttpParams} from "@angular/common/http";
import {Observable, Subscription} from "rxjs";
import {SelectedFilter} from "../model/selected-filter";
import {SelectedFilterService} from "./selected-filter.service";
import {EnvService } from "../../env/env.service";
import {environment} from "../../../environments/environment";
import {Field} from "../model/field";
@Injectable({
......@@ -11,13 +11,10 @@ import {Field} from "../model/field";
})
export class SearchResultsService {
private serverAddress: string = '';
private selectedFilters: Array<SelectedFilter> = [];
private selectedFiltersSub: Subscription;
constructor(private http: HttpClient, private selectedFilterService: SelectedFilterService, private env: EnvService) {
this.serverAddress = env.apiUrl;
constructor(private http: HttpClient, private selectedFilterService: SelectedFilterService) {
this.selectedFiltersSub = this.selectedFilterService.selectedFilters$.subscribe(selectedFilters => {
this.selectedFilters = selectedFilters;
});
......@@ -35,7 +32,7 @@ export class SearchResultsService {
params = params.append(key.name, JSON.stringify(key.value));
}
}
return this.http.get(this.serverAddress + endPoint, {observe: 'response', params: params});
return this.http.get(environment.apiUrl + endPoint, {observe: 'response', params: params});
}
getObservationDetails(id: string): Observable<any> {
......@@ -43,7 +40,7 @@ export class SearchResultsService {
params = params.append('solr_id', id);
console.warn('Obs Details Query');
console.log(params);
return this.http.get(this.serverAddress + 'restapi_get_full_exec_block_details', {observe: "response", params: params});
return this.http.get(environment.apiUrl + 'restapi_get_full_exec_block_details', {observe: "response", params: params});
}
getProjectDetails(id: string): Observable<any> {
......@@ -51,7 +48,7 @@ export class SearchResultsService {
params = params.append('project_code', '"' + id + '"');
console.warn('Project Details Query');
console.log(params);
return this.http.get(this.serverAddress + 'restapi_get_paged_exec_blocks', {observe: "response", params: params});
return this.http.get(environment.apiUrl + 'restapi_get_paged_exec_blocks', {observe: "response", params: params});
}
}
import { Injectable } from '@angular/core';
import { EnvService } from "./env.service";
import { HttpClient } from '@angular/common/http';
import {Injectable} from '@angular/core';
import {environment} from "../../environments/environment";
import {HttpClient} from '@angular/common/http';
@Injectable({
providedIn: 'root'
......@@ -10,14 +10,14 @@ export class AppConfigService {
configUrl = 'restapi_get_application_parameters';
facetUrl = 'restapi_get_execution_block_facets';
constructor(private http: HttpClient, private env: EnvService) { }
constructor(private http: HttpClient) { }
getConfig() {
return this.http.get(this.env.apiUrl + this.configUrl, {responseType: "json"});
return this.http.get(environment.apiUrl + this.configUrl, {responseType: "json"});
}
// we want to load facets only once per session - so it feels like they are config variables.
getFacets(){
return this.http.get(this.env.apiUrl + this.facetUrl, {responseType: "json"});
return this.http.get(environment.apiUrl + this.facetUrl, {responseType: "json"});
}
}
import { EnvService } from './env.service';
export const EnvServiceFactory = () => {
// Create env
const env = new EnvService();
// Read environment variables from browser window
const browserWindow = window || {};
const browserWindowEnv = browserWindow['__env'] || {};
// Assign environment variables from browser window to env
for (const key in browserWindowEnv) {
if (browserWindowEnv.hasOwnProperty(key)) {
env[key] = window['__env'][key];
}
}
return env;
};
export const EnvServiceProvider = {
provide: EnvService,
useFactory: EnvServiceFactory,
deps: [],
};
import { TestBed } from '@angular/core/testing';
import { EnvService } from './env.service';
describe('EnvService', () => {
beforeEach(() => TestBed.configureTestingModule({}));
it('should be created', () => {
const service: EnvService = TestBed.get(EnvService);
expect(service).toBeTruthy();
});
});
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class EnvService {
public apiUrl: string;
public workspacesUrl: string;
constructor() {
}
}
import { Injectable } from "@angular/core";
import { HttpClient, HttpParams, HttpResponse } from "@angular/common/http";
import { EnvService } from "../../env/env.service";
import { Observable } from "rxjs";
import { CapabilityRequest } from "../model/capability-request";
import { CapabilityExecution } from "../model/capability-execution";
import {Injectable} from "@angular/core";
import {HttpClient} from "@angular/common/http";
import {environment} from "../../../environments/environment";
import {Observable} from "rxjs";
import {CapabilityRequest} from "../model/capability-request";
import {CapabilityExecution} from "../model/capability-execution";
@Injectable({
providedIn: "root",
......@@ -11,7 +11,7 @@ import { CapabilityExecution } from "../model/capability-execution";
export class CapabilityLauncherService {
private endpoint = "capability/request";
constructor(private httpClient: HttpClient, private env: EnvService) {}
constructor(private httpClient: HttpClient) {}
/**
* Create capability request and send it to capability service
......@@ -22,7 +22,7 @@ export class CapabilityLauncherService {
capabilityName: string,
args: string
): Observable<CapabilityRequest> {
const url = this.env.workspacesUrl + this.endpoint;
const url = environment.workspacesUrl + this.endpoint;
const params = JSON.stringify({ capability: capabilityName, args: args });
return this.httpClient.post<CapabilityRequest>(url, params);
}
......@@ -32,7 +32,7 @@ export class CapabilityLauncherService {
* @param: requestId ID of capability request to submit
*/
submit(requestId: string): Observable<CapabilityExecution> {
const url = `${this.env.workspacesUrl}${this.endpoint}/${requestId}/submit`;
const url = `${environment.workspacesUrl}${this.endpoint}/${requestId}/submit`;
return this.httpClient.post<CapabilityExecution>(url, null);
}
}
<div class="container-fluid">
<div class="row">
<div class="row py-2">
<div class="col">
<button type="button" class="btn btn-primary" (click)="nullButtonOnClick()">Launch null capability [null -g]</button>
</div>
</div>
</div>
<div *ngFor="let request of capabilityRequests; index as i">
<div class="p-2" *ngFor="let request of capabilityRequests; index as i">
<code>Capability request created: {{request | json}}</code><br>
<code *ngIf="capabilityExecutions[i]">Capability execution created: {{capabilityExecutions[i] | json}}</code>
</div>
import { Component, OnInit } from "@angular/core";
import { CapabilityLauncherService } from "./services/capability-launcher.service";
import { Observable } from "rxjs";
import { CapabilityRequest } from "./model/capability-request";
import { map } from "rxjs/operators";
import { CapabilityExecution } from "./model/capability-execution";
import {Component, OnInit} from "@angular/core";
import {CapabilityLauncherService} from "./services/capability-launcher.service";
import {CapabilityRequest} from "./model/capability-request";
import {CapabilityExecution} from "./model/capability-execution";
@Component({
selector: "app-workspaces",
......
(function (window) {
window.__env = window.__env || {};
// API url
window.__env.apiUrl = 'https://webtest.aoc.nrao.edu/archiveServices/';
// Workspaces capability service URL
window.__env.workspacesUrl = 'http://localhost:3457/'
}(this));
export const environment = {
production: true
production: true,
// archive search services
apiUrl: 'https://webtest.aoc.nrao.edu/archiveServices/',
// workspace services
workspacesUrl: 'http://localhost:3457/'
};
export const environment = {
production: true,
// archive search services
apiUrl: 'https://webtest.aoc.nrao.edu/archiveServices/',
// workspace services
workspacesUrl: 'http://localhost:3457/'
};
......@@ -3,7 +3,11 @@
// The list of file replacements can be found in `angular.json`.
export const environment = {
production: false
production: false,
// archive search services
apiUrl: 'https://webtest.aoc.nrao.edu/archiveServices/',
// workspace services
workspacesUrl: 'http://localhost:3457/'
};
/*
......
......@@ -9,7 +9,6 @@
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link href='https://fonts.googleapis.com/css?family=Lato:300,400,700' rel='stylesheet' type='text/css'>
<script src="https://kit.fontawesome.com/bd536dc06d.js"></script>
<script src="env.js"></script>
</head>
<body>
<app-root></app-root>
......