fix: viya deploy page improved flow
This commit is contained in:
8
client/package-lock.json
generated
8
client/package-lock.json
generated
@ -21,7 +21,7 @@
|
||||
"@clr/icons": "^13.0.2",
|
||||
"@clr/ui": "file:libraries/clr-ui-17.9.0.tgz",
|
||||
"@handsontable/angular": "^15.3.0",
|
||||
"@sasjs/adapter": "file:../../../sasjs/adapter/build/sasjs-adapter-5.0.0.tgz",
|
||||
"@sasjs/adapter": "^4.11.0",
|
||||
"@sasjs/utils": "^3.4.0",
|
||||
"@sheet/crypto": "file:libraries/sheet-crypto.tgz",
|
||||
"@types/d3-graphviz": "^2.6.7",
|
||||
@ -5912,9 +5912,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@sasjs/adapter": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "file:../../../sasjs/adapter/build/sasjs-adapter-5.0.0.tgz",
|
||||
"integrity": "sha512-pAjHuL3UZw8LB+Ac2XlY2Td1EF0/mlbJRjZaF/V+2IV5V0ioBQTB5B2fMbtm+W2UJCPphajrXQTn+NEoCQ5Syw==",
|
||||
"version": "4.11.3",
|
||||
"resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-4.11.3.tgz",
|
||||
"integrity": "sha512-KF6G4vzs4l4efjpCD02og3kB44uFfJ1u2UWu749VdHtLKNN9l+PO26/moR+YAmRmmz2I9sC3X09fZE1nlN6zgw==",
|
||||
"hasInstallScript": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
|
@ -57,25 +57,6 @@ export class DeployComponent implements OnInit {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
if (this.sasJsConfig.serverType === ServerType.SasViya) {
|
||||
fetch('sasbuild/viya.json')
|
||||
.then((res) => res.text())
|
||||
.then((res) => {
|
||||
let initJsonFile: any = null
|
||||
|
||||
try {
|
||||
initJsonFile = JSON.parse(res)
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
|
||||
if (initJsonFile) {
|
||||
this.jsonFile = initJsonFile
|
||||
this.loggerService.log(this.jsonFile)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
this.setDeployDefaults()
|
||||
}
|
||||
|
||||
|
@ -9,14 +9,17 @@
|
||||
<p class="m-0 align-self-start">Done</p>
|
||||
<hr class="w-100" />
|
||||
|
||||
<div class="deploy-status-row">
|
||||
<div
|
||||
*ngIf="autoDeployStatus.deployServicePack !== null"
|
||||
class="deploy-status-row"
|
||||
>
|
||||
<clr-icon
|
||||
*ngIf="autoDeployStatus.deployServicePack"
|
||||
*ngIf="autoDeployStatus.deployServicePack === true"
|
||||
class="deploy-success"
|
||||
shape="success-standard"
|
||||
></clr-icon>
|
||||
<clr-icon
|
||||
*ngIf="!autoDeployStatus.deployServicePack"
|
||||
*ngIf="!autoDeployStatus.deployServicePack === false"
|
||||
class="deploy-error"
|
||||
shape="times-circle"
|
||||
></clr-icon>
|
||||
@ -94,9 +97,9 @@
|
||||
</div>
|
||||
|
||||
<label for="dcloc" class="mt-20 clr-control-label">DC Loc</label>
|
||||
<div class="mb-10 clr-control-container">
|
||||
<div class="mb-10 clr-control-container dc-loc-input-wrapper">
|
||||
<div class="clr-input-wrapper">
|
||||
<p class="mt-0">{{ dcPath }}</p>
|
||||
<input clrInput name="dcloc" [(ngModel)]="dcPath" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -107,7 +110,9 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<clr-checkbox-wrapper>
|
||||
<!-- Keeping this for a reference in case future VIYA changes and starts allowing separate backend and frontend) -->
|
||||
|
||||
<!-- <clr-checkbox-wrapper>
|
||||
<input
|
||||
clrCheckbox
|
||||
[(ngModel)]="recreateDatabase"
|
||||
@ -116,19 +121,28 @@
|
||||
checked
|
||||
/>
|
||||
<label>Recreate database</label>
|
||||
</clr-checkbox-wrapper>
|
||||
</clr-checkbox-wrapper> -->
|
||||
|
||||
<hr />
|
||||
|
||||
<button
|
||||
(click)="runAutoDeploy()"
|
||||
class="btn-autodeploy btn btn-primary d-inline-block mr-10"
|
||||
>
|
||||
Deploy
|
||||
</button>
|
||||
|
||||
<!-- Keeping this for a reference in case future VIYA changes and starts allowing separate backend and frontend) -->
|
||||
|
||||
<!-- <button
|
||||
(click)="executeJson()"
|
||||
class="btn-autodeploy btn btn-primary d-inline-block mr-10"
|
||||
[disabled]="!jsonFile"
|
||||
>
|
||||
Deploy {{ !jsonFile ? '(json file is not available)' : '' }}
|
||||
</button>
|
||||
</button> -->
|
||||
|
||||
<button
|
||||
<!-- <button
|
||||
(click)="uploadJsonAuto.click()"
|
||||
class="btn-autodeploy btn btn-primary d-inline-block mr-10"
|
||||
>
|
||||
@ -140,7 +154,7 @@
|
||||
hidden
|
||||
(click)="clearUploadInput($event)"
|
||||
(change)="onJsonFileChange($event)"
|
||||
/>
|
||||
/> -->
|
||||
|
||||
<clr-modal [(clrModalOpen)]="recreateDatabaseModal" [clrModalClosable]="false">
|
||||
<h3 class="modal-title">Warning</h3>
|
||||
|
@ -36,7 +36,11 @@ export class AutomaticComponent implements OnInit {
|
||||
public recreateDatabaseModal: boolean = false
|
||||
public isSubmittingJson: boolean = false
|
||||
public isJsonSubmitted: boolean = false
|
||||
public recreateDatabase: boolean = false
|
||||
/**
|
||||
* Default was `false` when deploy was done with frontend and backend separately.
|
||||
* Now we are using only streaming app, so we always want to recreate database (makedata)
|
||||
*/
|
||||
public recreateDatabase: boolean = true
|
||||
public createDatabaseLoading: boolean = false
|
||||
|
||||
/** autoDeployStatus
|
||||
@ -71,7 +75,6 @@ export class AutomaticComponent implements OnInit {
|
||||
* to create database if checkbox is toggled on
|
||||
*/
|
||||
public async executeJson() {
|
||||
this.autodeploying = true
|
||||
this.isSubmittingJson = true
|
||||
|
||||
try {
|
||||
@ -106,6 +109,14 @@ export class AutomaticComponent implements OnInit {
|
||||
}
|
||||
|
||||
this.isSubmittingJson = false
|
||||
}
|
||||
|
||||
public async runAutoDeploy(executeJson: boolean = false) {
|
||||
this.autodeploying = true
|
||||
|
||||
if (executeJson) {
|
||||
this.executeJson()
|
||||
}
|
||||
|
||||
if (this.recreateDatabase) {
|
||||
this.createDatabase()
|
||||
@ -133,7 +144,7 @@ export class AutomaticComponent implements OnInit {
|
||||
* contextName: null is the MUST field for it.
|
||||
*/
|
||||
let overrideConfig = {
|
||||
useComputeApi: false,
|
||||
useComputeApi: null,
|
||||
contextName: this.sasJsConfig.contextName,
|
||||
debug: true
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ export class ManualComponent implements OnInit {
|
||||
* contextName: null is the MUST field for it.
|
||||
*/
|
||||
let overrideConfig = {
|
||||
useComputeApi: false,
|
||||
useComputeApi: null,
|
||||
contextName: this.sasJsConfig.contextName,
|
||||
debug: true
|
||||
}
|
||||
|
@ -4,6 +4,8 @@ import { Observable } from 'rxjs'
|
||||
import { Collection } from '../viya-api-explorer/models/collection.model'
|
||||
import { AppStoreService } from './app-store.service'
|
||||
import { ViyaApis } from '../viya-api-explorer/models/viya-apis.models'
|
||||
import { ViyaApiFolderMembers } from '../viya-api-explorer/models/viya-api-folder-content.model'
|
||||
import { ViyaApiFolder } from '../viya-api-explorer/models/viya-api-folder.model'
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
@ -22,7 +24,8 @@ export class SasViyaService {
|
||||
},
|
||||
Compute: {
|
||||
jobs: '/jobDefinitions',
|
||||
jobExecution: '/jobExecution'
|
||||
jobExecution: '/jobExecution',
|
||||
contexts: '/compute/contexts'
|
||||
},
|
||||
Decision_Management: {
|
||||
modelManagement: '/modelManagement',
|
||||
@ -97,4 +100,32 @@ export class SasViyaService {
|
||||
withCredentials: true
|
||||
})
|
||||
}
|
||||
|
||||
getComputeContexts(): Observable<any> {
|
||||
return this.http.get<any>(`${this.serverUrl}/compute/contexts`, {
|
||||
withCredentials: true
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* @param path Path to the folder
|
||||
* @returns The folder info object
|
||||
*/
|
||||
getFolderByPath(path: string): Observable<ViyaApiFolder> {
|
||||
return this.http.get<any>(
|
||||
`${this.serverUrl}/folders/folders/@item?path=${path}`,
|
||||
{
|
||||
withCredentials: true
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
getFolderMembers(folderId: string): Observable<ViyaApiFolderMembers> {
|
||||
return this.http.get<any>(
|
||||
`${this.serverUrl}/folders/folders/${folderId}/members`,
|
||||
{
|
||||
withCredentials: true
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,9 @@ import { RequestWrapperOptions } from '../models/request-wrapper/RequestWrapperO
|
||||
import { ErrorBody } from '../models/ErrorBody'
|
||||
import { UploadFileResponse } from '../models/UploadFile'
|
||||
import { RequestWrapperResponse } from '../models/request-wrapper/RequestWrapperResponse'
|
||||
import { SasViyaService } from './sas-viya.service'
|
||||
import { ViyaApiFolder } from '../viya-api-explorer/models/viya-api-folder.model'
|
||||
import { ViyaApiFolderMembers } from '../viya-api-explorer/models/viya-api-folder-content.model'
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
@ -38,6 +41,7 @@ export class SasService {
|
||||
private userService: UserService,
|
||||
private eventService: EventService,
|
||||
private sasjsService: SasjsService,
|
||||
private sasViyaService: SasViyaService,
|
||||
private loggerService: LoggerService,
|
||||
private router: Router
|
||||
) {}
|
||||
@ -423,21 +427,93 @@ export class SasService {
|
||||
typeof this.sasjsAdapter.getFolder !== 'undefined'
|
||||
|
||||
let appLocExists: boolean = false
|
||||
let errorMessage: string | undefined = undefined
|
||||
|
||||
if (getFolderExistsInAdapter) {
|
||||
appLocExists = await this.appLocCheck(path)
|
||||
const results = await this.appLocCheck(path)
|
||||
|
||||
appLocExists = results.found
|
||||
errorMessage = results.errorMessage
|
||||
} else {
|
||||
appLocExists = await this.appLocCheckPreAxiosdAdapter(path)
|
||||
}
|
||||
|
||||
if (appLocExists) {
|
||||
this.loadStartupServiceEmitter.emit()
|
||||
// Check if there is appLoc/services/admin/makedata.sas present
|
||||
// if yes, it needs to be run, so we redirect to /deploy
|
||||
// if not, we load the startup service
|
||||
|
||||
this.viyaMakedataSuccessfull().then(
|
||||
(success: boolean) => {
|
||||
if (success) {
|
||||
this.loadStartupServiceEmitter.emit()
|
||||
} else {
|
||||
this.eventService.startupDataLoaded()
|
||||
this.router.navigateByUrl('/deploy')
|
||||
}
|
||||
},
|
||||
(error: any) => {
|
||||
console.error('Error while looking for the file: makedata.sas', error)
|
||||
}
|
||||
)
|
||||
} else {
|
||||
const errorMessageToShow =
|
||||
(errorMessage ||
|
||||
'Viya services are not present on the current appLoc, or API not reachable. Check the ADAPTER configuration.') +
|
||||
`\nAppLoc: ${path}`
|
||||
|
||||
this.eventService.showInfoModal('Error', errorMessageToShow)
|
||||
}
|
||||
}
|
||||
|
||||
public appLocCheck(path: string): Promise<boolean> {
|
||||
private async viyaMakedataSuccessfull(): Promise<boolean> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const sasjsConfig = this.getSasjsConfig()
|
||||
const configuratorFolder = `${sasjsConfig.appLoc}/services/admin`
|
||||
|
||||
this.sasViyaService.getFolderByPath(configuratorFolder).subscribe(
|
||||
(folderInfo: ViyaApiFolder) => {
|
||||
const folderId = folderInfo.id
|
||||
|
||||
if (!folderId) {
|
||||
console.error(
|
||||
`Folder ID is not present. ${configuratorFolder}`,
|
||||
sasjsConfig
|
||||
)
|
||||
resolve(false)
|
||||
}
|
||||
|
||||
this.sasViyaService.getFolderMembers(folderId).subscribe(
|
||||
(members: ViyaApiFolderMembers) => {
|
||||
if (
|
||||
!members.items.some((item: any) => item.name === 'makedata')
|
||||
) {
|
||||
// Makedata.sas is not present, which means it was run
|
||||
resolve(true)
|
||||
} else {
|
||||
// Makedata.sas is present, which means it was not run
|
||||
resolve(false)
|
||||
}
|
||||
},
|
||||
(err: any) => {
|
||||
console.error('Error getting folder contents', err)
|
||||
reject()
|
||||
}
|
||||
)
|
||||
},
|
||||
(err: any) => {
|
||||
console.warn('Error getting folder info', err)
|
||||
reject(err)
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
public appLocCheck(
|
||||
path: string
|
||||
): Promise<{ found: boolean; errorMessage?: string }> {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
let statusNotFound: boolean = false
|
||||
let fetchError: string = ''
|
||||
|
||||
let res: any
|
||||
|
||||
@ -448,20 +524,21 @@ export class SasService {
|
||||
this.appLocCheckPending = true
|
||||
this.shouldLogin.next(true)
|
||||
|
||||
resolve(false)
|
||||
resolve({ found: false })
|
||||
} else if (err.name === 'NotFoundeError') {
|
||||
fetchError = err.message
|
||||
} else {
|
||||
statusNotFound = true
|
||||
fetchError =
|
||||
'Viya services are not present on the current appLoc, or API not reachable. Check the ADAPTER configuration.'
|
||||
}
|
||||
}
|
||||
|
||||
if (statusNotFound) {
|
||||
console.warn('Viya services are not present on the current appLoc.')
|
||||
this.eventService.startupDataLoaded()
|
||||
this.router.navigateByUrl('/deploy')
|
||||
return resolve(false)
|
||||
if (fetchError.length) {
|
||||
console.warn(fetchError)
|
||||
return resolve({ found: false, errorMessage: fetchError })
|
||||
}
|
||||
|
||||
resolve(true)
|
||||
resolve({ found: true })
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,45 @@
|
||||
export interface ViyaApiFolderMembers {
|
||||
version: number
|
||||
accept: string
|
||||
count: number
|
||||
start: number
|
||||
limit: number
|
||||
name: string
|
||||
items: Item[]
|
||||
links: Link2[]
|
||||
}
|
||||
|
||||
export interface Link2 {
|
||||
method: string
|
||||
rel: string
|
||||
href: string
|
||||
uri: string
|
||||
type: string
|
||||
itemType?: string
|
||||
responseType?: string
|
||||
}
|
||||
|
||||
export interface Item {
|
||||
creationTimeStamp: string
|
||||
createdBy: string
|
||||
modifiedTimeStamp: string
|
||||
modifiedBy: string
|
||||
version: number
|
||||
id: string
|
||||
name: string
|
||||
added: string
|
||||
parentFolderUri: string
|
||||
uri: string
|
||||
type: string
|
||||
contentType: string
|
||||
links: Link[]
|
||||
}
|
||||
|
||||
export interface Link {
|
||||
method: string
|
||||
rel: string
|
||||
href: string
|
||||
uri: string
|
||||
type?: string
|
||||
responseType?: string
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Viya API Folder info object
|
||||
*/
|
||||
export interface ViyaApiFolder {
|
||||
creationTimeStamp: string
|
||||
createdBy: string
|
||||
modifiedTimeStamp: string
|
||||
modifiedBy: string
|
||||
version: number
|
||||
id: string
|
||||
name: string
|
||||
parentFolderUri: string
|
||||
type: string
|
||||
memberCount: number
|
||||
links: Link[]
|
||||
}
|
||||
|
||||
export interface Link {
|
||||
method: string
|
||||
rel: string
|
||||
href: string
|
||||
uri: string
|
||||
type?: string
|
||||
responseType?: string
|
||||
itemType?: string
|
||||
}
|
18
sas/package-lock.json
generated
18
sas/package-lock.json
generated
@ -6,8 +6,8 @@
|
||||
"": {
|
||||
"name": "dc-sas",
|
||||
"dependencies": {
|
||||
"@sasjs/cli": "^4.12.2",
|
||||
"@sasjs/core": "^4.56.1"
|
||||
"@sasjs/cli": "^4.12.5",
|
||||
"@sasjs/core": "^4.57.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@coolaj86/urequest": {
|
||||
@ -45,14 +45,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@sasjs/cli": {
|
||||
"version": "4.12.2",
|
||||
"resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-4.12.2.tgz",
|
||||
"integrity": "sha512-/U0V11WI4QJezCpYgbqil/InN46Hges4sknh/Jyqo10VemcezEAGjTdfVIS1P09RUQ0Atdx0OSCh6TpMMXNWwQ==",
|
||||
"version": "4.12.5",
|
||||
"resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-4.12.5.tgz",
|
||||
"integrity": "sha512-y6JFATKlTyTl0gRPpDBPL1rwZsyeuyp5uEz7HMA7raSzQuNa6QZ1oO1Er91I7+cLUg0Ndh5aSNGKYOdBRStQ2g==",
|
||||
"hasInstallScript": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@sasjs/adapter": "4.11.3",
|
||||
"@sasjs/core": "4.56.1",
|
||||
"@sasjs/core": "4.57.0",
|
||||
"@sasjs/lint": "2.4.3",
|
||||
"@sasjs/utils": "3.5.2",
|
||||
"adm-zip": "0.5.10",
|
||||
@ -77,9 +77,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@sasjs/core": {
|
||||
"version": "4.56.1",
|
||||
"resolved": "https://registry.npmjs.org/@sasjs/core/-/core-4.56.1.tgz",
|
||||
"integrity": "sha512-RI/DrQ+aluFsX2i+K6M66N+sUNnMLHpFKF5IDDYkgA8vLaiEXfJaqrNeNL2FhTRFRrdvv0bCspmeZEK8fYelhQ==",
|
||||
"version": "4.57.0",
|
||||
"resolved": "https://registry.npmjs.org/@sasjs/core/-/core-4.57.0.tgz",
|
||||
"integrity": "sha512-iJiLnW4oY15InGerXXWtrjc1YpJ9UDz72+r7Odfr/yYR7RxIhtXGjYQIqyQu6US+cS/0b2pi12LZB6VnfMS/pA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@sasjs/lint": {
|
||||
|
@ -28,7 +28,7 @@
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@sasjs/cli": "^4.12.2",
|
||||
"@sasjs/core": "^4.56.1"
|
||||
"@sasjs/cli": "^4.12.5",
|
||||
"@sasjs/core": "^4.57.0"
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user