blob: 8342c1f6c7b8fd7ab6ae22c05b52a9406ffe5725 [file] [log] [blame]
<template>
<v-container grid-list-md class="ma-5">
<div v-if="!downloadFormsOnly && !clusterCreated && !error">
<h3>Please wait while Jemo creates the cluster. This can take up to 15 minutes.</h3>
<v-progress-linear :indeterminate="true"></v-progress-linear>
<div v-if="clusterCreationResponse">
<pre>{{ clusterCreationResponse.output }}</pre>
<div class="pa-3">
<v-progress-circular indeterminate :size="16"></v-progress-circular>
</div>
</div>
</div>
<div v-if="error">
<div v-if="error.code === 'TERRAFORM_NOT_INSTALLED'">
<h3>The server can not find the terraform command.</h3>
Either terraform is not installed (<a
href="https://learn.hashicorp.com/terraform/getting-started/install.html" target="_blank">Installation
instructions</a>),
or it is not in the path. (e.g. run: terraform -version).
<br/>
<br/>
<v-btn @click="createCluster(true)" color="primary" :loading="loading">Fixed</v-btn>
</div>
<div v-else-if="error.code === 'KUBECTL_NOT_INSTALLED'">
<h3>The server can not find the kubectl command.</h3>
Either kubectl is not installed (<a
href="https://kubernetes.io/docs/tasks/tools/install-kubectl/" target="_blank">Installation
instructions</a>),
or it is not in the path. (e.g. run: kubectl --help).
<br/>
<br/>
<v-btn @click="createCluster(true)" color="primary" :loading="loading">Fixed</v-btn>
</div>
<div v-else>
<h3>Failed to create the cluster. The following error occurred:</h3>
<pre>{{error.message}}</pre>
<br>
<v-btn :to="{name: 'delete', params: {csp: this.csp, mode: 'CLUSTER'}}" color="primary">Revert</v-btn>
</div>
</div>
<div v-if="clusterCreated">
<h3>Setup Completed</h3>
<br/>
Great job! The cluster is created.
<br/>
You can access jemo on <a :href=clusterCreationResponse.loadBalancerUrl target="_blank">{{clusterCreationResponse.loadBalancerUrl}}</a>.
You may need to wait 1-2 minutes before accessing it.
<br/>
<br/>
Terraform reported the following created resources and outputs.
<br/>
<br/>
<v-toolbar flat color="white">
<v-toolbar-title>Created Resources</v-toolbar-title>
</v-toolbar>
<v-data-table
:items=createItems(clusterCreationResponse.terraformResult.createdResources)
class="elevation-1"
hide-actions
hide-headers
>
<template slot="items" slot-scope="props" >
<td>{{ props.item.name }}</td>
<td>{{ props.item.value }}</td>
</template>
</v-data-table>
<br/>
<v-toolbar flat color="white">
<v-toolbar-title>Outputs</v-toolbar-title>
</v-toolbar>
<v-data-table
:items=createItems(clusterCreationResponse.terraformResult.outputs)
class="elevation-1"
hide-actions
hide-headers
>
<template slot="items" slot-scope="props" >
<td>{{ props.item.name }}</td>
<td>{{ props.item.value }}</td>
</template>
</v-data-table>
<br/>
</div>
<div v-if="terraformFilesDownloaded">
<h3>Please unzip the downloaded file, open the file 'README.txt' and follow the instructions.</h3>
</div>
</v-container>
</template>
<script>
export default {
data() {
return {
csp: this.$route.params.csp,
parameters: this.$route.params.parameters,
downloadFormsOnly: this.$route.params.downloadFormsOnly,
clusterCreated: false,
error: null,
clusterCreationResponse: null,
terraformFilesDownloaded: false,
timer: null,
loading: false
}
},
watch: {
'$route'(to) {
if (to.name === 'create-cluster') {
this.csp = to.params.csp ? to.params.csp : this.csp;
this.parameters = to.params.parameters ? to.params.parameters : this.parameters;
this.downloadFormsOnly = to.params.downloadFormsOnly;
this.clusterCreated = false;
this.loading = false;
this.createCluster(false);
}
}
},
mounted() {
this.createCluster(false);
},
methods: {
createCluster(fixedPressed) {
this.loading = fixedPressed;
const payload = {
csp: this.csp.name,
parameters: this.parameters
};
if (this.downloadFormsOnly) {
this.$http.post('cluster/download', payload, {responseType: 'blob'})
.then(response => {
return response.blob();
}).then(blob => {
const a = document.createElement("a");
document.body.appendChild(a);
const url = window.URL.createObjectURL(blob);
a.href = url;
a.download = 'cluster.zip';
a.click();
window.URL.revokeObjectURL(url);
a.remove();
this.terraformFilesDownloaded = true;
});
} else {
this.$http.post('cluster', payload)
.then(response => {
console.log(response);
this.error = null;
this.timer = setInterval(this.pollForClusterCreationResult, 10000);
}, response => {
console.log(response);
this.error = response.data;
this.loading = false;
});
}
},
pollForClusterCreationResult() {
this.$http.get('cluster/result')
.then(response => {
console.log(response);
this.clusterCreationResponse = response.data;
if (response.data.status === 'FINISHED') {
clearInterval(this.timer);
if (response.data.error) {
this.error = response.data.error;
} else {
this.clusterCreated = true;
this.error = null;
}
}
}, response => {
clearInterval(this.timer);
console.log(response);
this.error = response.data;
alert(response.data);
});
},
createItems(jsonObject) {
const items = [];
for (let key in jsonObject) {
items.push({
name: key,
value: jsonObject[key]
});
}
console.log(items);
return items;
}
}
}
</script>