You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
587 lines
20 KiB
587 lines
20 KiB
3 years ago
|
<template>
|
||
|
<card class="card-user" style="max-height:100%">
|
||
|
<div class="author">
|
||
|
<img class="avatar border-white" src="@/assets/img/docker.png" alt="...">
|
||
|
</div>
|
||
|
|
||
|
<b-container fluid class="bv-example-row">
|
||
|
<div class="row text-center">
|
||
|
<div class="col-12">
|
||
|
<b>View and Manage your builds</b>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<br>
|
||
|
<div class="input-group input-group-sm sm-3">
|
||
|
<div class="input-group-prepend">
|
||
|
<button
|
||
|
v-if="$socket.disconnected"
|
||
|
class="ti-unlink btn btn-outline-danger"
|
||
|
round
|
||
|
type="button"
|
||
|
title="You are disconnected from Swarmlab-hybrid"
|
||
|
disabled
|
||
|
>
|
||
|
</button>
|
||
|
<button
|
||
|
v-else
|
||
|
class="ti-link btn btn-outline-success"
|
||
|
round
|
||
|
type="button"
|
||
|
title="You are connected swarmlab-hybrid"
|
||
|
disabled
|
||
|
>
|
||
|
</button>
|
||
|
</div>
|
||
|
<div class="input-group-prepend">
|
||
|
<!--
|
||
|
<button
|
||
|
class="btn btn-outline-success"
|
||
|
round
|
||
|
type="button"
|
||
|
@click="onAction('start')"
|
||
|
>
|
||
|
Start</button>
|
||
|
-->
|
||
|
</div>
|
||
|
<div class="input-group-prepend">
|
||
|
<button
|
||
|
v-if="hybridshowdata.name"
|
||
|
class="btn btn-outline-success"
|
||
|
round
|
||
|
type="button"
|
||
|
@click="onAction('container-build')"
|
||
|
>
|
||
|
Build</button>
|
||
|
<button
|
||
|
v-if="hybridshowdata.name"
|
||
|
class="btn btn-outline-secondary ti-info"
|
||
|
round
|
||
|
type="button"
|
||
|
@click="onAction('container-build-info')"
|
||
|
>
|
||
|
</button>
|
||
|
<button
|
||
|
v-else
|
||
|
class="btn btn-outline-secondary"
|
||
|
round
|
||
|
type="button"
|
||
|
disabled
|
||
|
>
|
||
|
Connect</button>
|
||
|
<button
|
||
|
class="btn btn-outline-danger"
|
||
|
round
|
||
|
type="button"
|
||
|
@click="onAction('container-stop')"
|
||
|
>
|
||
|
Stop</button>
|
||
|
</div>
|
||
|
|
||
|
<div class="input-group-append">
|
||
|
</div>
|
||
|
|
||
|
</div>
|
||
|
</b-container>
|
||
|
<b-container fluid>
|
||
|
<div class="row" >
|
||
|
<div class="col-2 text-info" >
|
||
|
ID
|
||
|
</div>
|
||
|
<div class="col-3 text-secondary" >
|
||
|
{{ hybridshowdata.ID }}
|
||
|
</div>
|
||
|
<div class="col-2 text-info" >
|
||
|
Image
|
||
|
</div>
|
||
|
<div class="col-4 text-secondary" >
|
||
|
{{ hybridshowdata.Image }}
|
||
|
</div>
|
||
|
</div> <!-- row -->
|
||
|
<div class="row" >
|
||
|
<div class="col-2 text-info" >
|
||
|
Names
|
||
|
</div>
|
||
|
<div class="col-3 text-secondary" >
|
||
|
{{ hybridshowdata.name }}
|
||
|
</div>
|
||
|
<div class="col-2 text-info" >
|
||
|
RunningFor
|
||
|
</div>
|
||
|
<div class="col-4 text-secondary" >
|
||
|
{{ hybridshowdata.RunningFor }}
|
||
|
</div>
|
||
|
</div> <!-- row -->
|
||
|
<div class="row" >
|
||
|
|
||
|
<div class="col-2 text-info" >
|
||
|
Status
|
||
|
</div>
|
||
|
<div class="col-3 text-secondary" >
|
||
|
{{ hybridshowdata.Status }}
|
||
|
</div>
|
||
|
|
||
|
<div class="col-2 text-info" >
|
||
|
CreatedAt
|
||
|
</div>
|
||
|
<div class="col-4 text-secondary" >
|
||
|
{{ hybridshowdata.CreatedAt }}
|
||
|
</div>
|
||
|
</div> <!-- row -->
|
||
|
<div class="row" >
|
||
|
|
||
|
<div class="col-2 text-info" >
|
||
|
<button
|
||
|
v-if="hybridshowdata.Networks&&addNetworkMenou==false"
|
||
|
class="btn btn-outline-info btn-sm"
|
||
|
round
|
||
|
type="button"
|
||
|
@click="addNetwork(hybridshowdata,'on')"
|
||
|
>
|
||
|
Networks</button>
|
||
|
<button
|
||
|
v-if="hybridshowdata.Networks&&addNetworkMenou==true"
|
||
|
class="btn btn-outline-warning btn-sm"
|
||
|
round
|
||
|
type="button"
|
||
|
@click="addNetwork(hybridshowdata,'off')"
|
||
|
>
|
||
|
Networks</button>
|
||
|
</div>
|
||
|
<div class="col-3 text-secondary" >
|
||
|
{{ hybridshowdata.Networks }}
|
||
|
</div>
|
||
|
|
||
|
<div class="col-2 text-info" >
|
||
|
Ports
|
||
|
</div>
|
||
|
<div class="col-4 text-secondary" >
|
||
|
{{ hybridshowdata.Ports }}
|
||
|
</div>
|
||
|
</div> <!-- row -->
|
||
|
<!--
|
||
|
'{"ID":"{{ .ID }}", "Image": "{{ .Image }}", "Names":"{{ .Names }}", "Ports":"{{.Ports}}",
|
||
|
"Networks":"{{.Networks}}", "Status":"{{.Status}}","RunningFor":"{{.RunningFor}}","CreatedAt":"{{.CreatedAt}}"}'
|
||
|
-->
|
||
|
</b-container>
|
||
|
|
||
|
<!-- Networks -->
|
||
|
|
||
|
<div class="card border-success bg-light mb-3" style="max-width: 100%;"
|
||
|
v-if="addNetworkMenou==true"
|
||
|
>
|
||
|
<div class="card-header"></div>
|
||
|
<div class="card-body text-info">
|
||
|
<div class="row">
|
||
|
<div class="col-6 text-info">
|
||
|
<h5 class="card-title">Select network</h5>
|
||
|
</div>
|
||
|
<div class="col-6 text-info">
|
||
|
Connect a running container to multiple networks
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div class="row">
|
||
|
<div class="col-6 text-info">
|
||
|
<b-form-select v-model="selectedNetworks" :options="localNetworkoptions" multiple :select-size="4"></b-form-select>
|
||
|
<div class="mt-3">Selected: <strong>{{ selectedNetworks }}</strong></div>
|
||
|
</div>
|
||
|
<div class="col-6 text-info">
|
||
|
<img class="border-white img-thumbnail" src="@/assets/img/dockernetwork.png" alt="...">
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div class="row">
|
||
|
<div class="col-6 text-info">
|
||
|
<button
|
||
|
class="btn btn-outline-warning btn-sm"
|
||
|
round
|
||
|
type="button"
|
||
|
@click="updateNetwork(hybridshowdata,'update')"
|
||
|
>
|
||
|
Update</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
|
||
|
</card>
|
||
|
</template>
|
||
|
<script>
|
||
|
import store from '@/store/index'
|
||
|
import {mapState, mapGetters, mapActions,dispatch} from 'vuex'
|
||
|
import Vue from 'vue'
|
||
|
import card from '@/components/Card.vue'
|
||
|
import {ApiConfig} from "@/config/index";
|
||
|
import { extend } from 'vee-validate';
|
||
|
import { required, alpha_num } from 'vee-validate/dist/rules';
|
||
|
|
||
|
// No message specified.
|
||
|
extend('alpha_num', alpha_num);
|
||
|
|
||
|
// Override the default message.
|
||
|
extend('required', {
|
||
|
...required,
|
||
|
message: 'This field is required'
|
||
|
});
|
||
|
|
||
|
export default {
|
||
|
components: {
|
||
|
card
|
||
|
},
|
||
|
props: {
|
||
|
},
|
||
|
data() {
|
||
|
return{
|
||
|
addNetworkMenou:false,
|
||
|
selectedNetworks:[],
|
||
|
localNetworkoptions:[],
|
||
|
localNetworkdefault:'',
|
||
|
STATUS:{},
|
||
|
CONFIG:{
|
||
|
'status':'',
|
||
|
'workerkey':'',
|
||
|
'swarmlab_public_wgkey':'',
|
||
|
'server_ip':'',
|
||
|
'allowed_ips':'',
|
||
|
'wg_port':'',
|
||
|
'wg_ip':'',
|
||
|
'swarm_ip':'',
|
||
|
'privatekey':'',
|
||
|
'publickey':'',
|
||
|
'workerkey':'',
|
||
|
'privatekey':'',
|
||
|
'publickey':'',
|
||
|
'server_ip':''
|
||
|
},
|
||
|
sshpid:0,
|
||
|
buildpid:0,
|
||
|
CONFIGallowed_ips:'',
|
||
|
swarmlabname:'swarmlab-sec',
|
||
|
swarmlabname_port:'',
|
||
|
swarmlabname_size:3,
|
||
|
swarmlabname_git:'',
|
||
|
// run on
|
||
|
hybridshowdata:{},
|
||
|
issocket:'close',
|
||
|
setFilter: {},
|
||
|
searchFor: {},
|
||
|
resetFilter: {}
|
||
|
|
||
|
}
|
||
|
},
|
||
|
beforeMount () {
|
||
|
//console.log('send')
|
||
|
},
|
||
|
mounted() {
|
||
|
// this.$root.$on('SERVER_build_set_sshpid', (data) => {
|
||
|
// this.sshpid = data.pid
|
||
|
// })
|
||
|
this.$root.$on('SERVER_build_set_buildpid', (data) => {
|
||
|
this.buildpid = data.pid
|
||
|
})
|
||
|
this.$root.$on('BUILD_hybrid_show_info', (data) => {
|
||
|
this.$nextTick(function () {
|
||
|
this.hybridshowdata = data
|
||
|
this.addNetworkMenou = false
|
||
|
this.selectedNetworks = []
|
||
|
this.localNetworkoptions = []
|
||
|
this.localNetworkdefault = ''
|
||
|
//console.log(JSON.stringify(this.hybridshowdata))
|
||
|
})
|
||
|
})
|
||
|
},
|
||
|
created() {
|
||
|
var url_string = window.location.href
|
||
|
var url = new URL(url_string);
|
||
|
this.token = url.searchParams.get("token");
|
||
|
//console.log("token "+ this.token);
|
||
|
var log = store.dispatch("pipelineLLO/settoken",{
|
||
|
token:this.token
|
||
|
})
|
||
|
|
||
|
},
|
||
|
beforeDestroy () {
|
||
|
this.$root.$off('BUILD_hybrid_show_info')
|
||
|
this.$root.$off('SERVER_build_set_buildpid')
|
||
|
//this.$root.$off('SERVER_build_set_sshpid')
|
||
|
},
|
||
|
computed: {
|
||
|
httpOptions() {
|
||
|
var token = this.token
|
||
|
var p="headers: {Authorization: token}}"; //table props -> :http-options="httpOptions"
|
||
|
return {headers: {Authorization: 'Bearer ' + token}} //table props -> :http-options="httpOptions"
|
||
|
},
|
||
|
|
||
|
},
|
||
|
|
||
|
methods: {
|
||
|
async onAction(action){
|
||
|
if(action == 'container-logs'){
|
||
|
//this.$socket.client.open();
|
||
|
//this.$socket.client.emit('build-vmlist', 'test');
|
||
|
//this.$root.$emit('SERVER_build_vmlist')
|
||
|
console.log('logs---------- ' + JSON.stringify(this.hybridshowdata))
|
||
|
}else if(action == 'container-build-info'){
|
||
|
var info = `
|
||
|
<b-container fluid>
|
||
|
<div class="row text-center">
|
||
|
<div class="col-12">
|
||
|
<h4><b>Tips and caveats</b></h4>
|
||
|
|
||
|
<div class="list-group">
|
||
|
<div class="d-flex w-100 justify-content-between">
|
||
|
<h5 class="mb-1"><b>Install software</b></h5>
|
||
|
</div>
|
||
|
<p class="mb-1 list-group-item list-group-item-info">
|
||
|
<b>Vagrant, Packer</b> and <b>VirtualBox</b> must be installed
|
||
|
</p>
|
||
|
<p class="mb-1 list-group-item list-group-item-info">
|
||
|
You can find installation instructions <a href="https://git.swarmlab.io:3000/swarmlab/swarmlab-build-install" target="new">here</a>
|
||
|
</p>
|
||
|
|
||
|
|
||
|
</div> <!-- list -->
|
||
|
|
||
|
</div> <!-- col -->
|
||
|
</div> <!-- row -->
|
||
|
</b-container fluid>
|
||
|
`
|
||
|
this.$swal({
|
||
|
type: 'info',
|
||
|
html: info,
|
||
|
showCloseButton: true,
|
||
|
showLoaderOnConfirm: false,
|
||
|
allowOutsideClick: false,
|
||
|
cancelButtonText: 'No, cancel!',
|
||
|
showCancelButton: false,
|
||
|
showLoaderOnConfirm: false,
|
||
|
reverseButtons: true,
|
||
|
focusCancel: false,
|
||
|
confirmButtonText: 'ok! '
|
||
|
})
|
||
|
}else if(action == 'container-build'){
|
||
|
var info = `
|
||
|
<b-container fluid>
|
||
|
<div class="row text-center">
|
||
|
<div class="col-12">
|
||
|
<h4><b>Tips and caveats</b></h4>
|
||
|
|
||
|
<div class="list-group">
|
||
|
<div class="d-flex w-100 justify-content-between">
|
||
|
<h5 class="mb-1"><b>Disk space</b></h5>
|
||
|
</div>
|
||
|
<p class="mb-1 list-group-item list-group-item-info">
|
||
|
You need to run Builder on a machine with a <b>lot of free disk space</b> (sometimes 50 GB or more). <br> The installation media, VM(s) and box(es) take considerable amounts of space, at least temporarily.
|
||
|
</p>
|
||
|
</div> <!-- list -->
|
||
|
|
||
|
<div class="list-group">
|
||
|
<div class="d-flex w-100 justify-content-between">
|
||
|
<h5 class="mb-1"><b>Time</b></h5>
|
||
|
</div>
|
||
|
<p class="mb-1 list-group-item list-group-item-info">
|
||
|
Building a box <b>can easily take several hours</b>, most notably because installing OS updates is time-consuming.
|
||
|
</p>
|
||
|
</div> <!-- list -->
|
||
|
|
||
|
<div class="list-group">
|
||
|
<div class="d-flex w-100 justify-content-between">
|
||
|
<h5 class="mb-1"><b>Incompatibilities</b></h5>
|
||
|
</div>
|
||
|
<p class="mb-1 list-group-item list-group-item-info">
|
||
|
Beware of version incompatibilities of hypervisors.
|
||
|
<small class="text-left list-group-item list-group-item-info">
|
||
|
For example a box built with VirtualBox 6.0 refusing to run on VirtualBox 5.<br>
|
||
|
</small>
|
||
|
If in doubt, deliberately use older hypervisor versions on the build machine.
|
||
|
</p>
|
||
|
</div> <!-- list -->
|
||
|
|
||
|
<div class="list-group">
|
||
|
<div class="d-flex w-100 justify-content-between">
|
||
|
<h5 class="mb-1"><b>Output</b></h5>
|
||
|
</div>
|
||
|
<p class="mb-1 list-group-item list-group-item-success">
|
||
|
The output of a successful build is a .box file.
|
||
|
</p>
|
||
|
</div> <!-- list -->
|
||
|
|
||
|
<div class="list-group">
|
||
|
<div class="d-flex w-100 justify-content-between">
|
||
|
<h5 class="mb-1"><b>Install software</b></h5>
|
||
|
</div>
|
||
|
<p class="mb-1 list-group-item list-group-item-success">
|
||
|
With ansible you can install additional software into the box,
|
||
|
</p>
|
||
|
</div> <!-- list -->
|
||
|
|
||
|
|
||
|
</div> <!-- col -->
|
||
|
</div> <!-- row -->
|
||
|
</b-container fluid>
|
||
|
`
|
||
|
this.$swal({
|
||
|
type: 'info',
|
||
|
html: info,
|
||
|
showCloseButton: true,
|
||
|
showLoaderOnConfirm: false,
|
||
|
allowOutsideClick: false,
|
||
|
cancelButtonText: 'No, cancel!',
|
||
|
showCancelButton: true,
|
||
|
showLoaderOnConfirm: false,
|
||
|
reverseButtons: true,
|
||
|
focusCancel: false,
|
||
|
confirmButtonText: 'Create the box! '
|
||
|
}).then((result)=> {
|
||
|
this.buildAndClose(result);
|
||
|
})
|
||
|
|
||
|
}else if(action == 'container-stop'){
|
||
|
var obj = {}
|
||
|
obj.pid = this.buildpid
|
||
|
console.log('PID '+ this.buildpid)
|
||
|
this.$root.$emit('SERVER_build_kill',obj)
|
||
|
}else if(action == 'stop'){
|
||
|
this.$socket.client.emit('stop', this.swarmlabname);
|
||
|
}
|
||
|
},
|
||
|
async buildAndClose(result){
|
||
|
var obj = {}
|
||
|
obj.name = this.hybridshowdata.name
|
||
|
obj.dir = this.hybridshowdata.dir
|
||
|
obj.config = this.hybridshowdata.config
|
||
|
console.log('value result '+ JSON.stringify(result))
|
||
|
console.log('value obj '+ JSON.stringify(obj))
|
||
|
if (result.isConfirmed) {
|
||
|
console.log('yes')
|
||
|
this.$root.$emit('SERVER_build_image',obj)
|
||
|
// run on mytable.vue
|
||
|
//refresh table
|
||
|
//this.$root.$emit('hybrid_stop_instance', value)
|
||
|
var info = `
|
||
|
<b-container fluid>
|
||
|
<div class="row text-center">
|
||
|
<div class="col-12">
|
||
|
|
||
|
<p class="mb-1 list-group-item list-group-item-success">
|
||
|
You can track the pending box creation from the embeded console or the graphical interface that will open.
|
||
|
</p>
|
||
|
|
||
|
<p class="mb-1 list-group-item list-group-item-info">
|
||
|
There will also be a spinny wheel above the console indicating work in proccess.
|
||
|
</p>
|
||
|
|
||
|
<p class="mb-1 list-group-item list-group-item-success">
|
||
|
Please note that closing the window(graphical) WILL NOT terminate the process.
|
||
|
</p>
|
||
|
|
||
|
<p class="mb-1 list-group-item list-group-item-info">
|
||
|
If you wish to forcefully stop you should use the STOP button.
|
||
|
</p>
|
||
|
|
||
|
<p class="mb-1 list-group-item list-group-item-success">
|
||
|
Note that the stop operation itself may take a little time.
|
||
|
</p>
|
||
|
|
||
|
<p class="mb-1 list-group-item list-group-item-light">
|
||
|
When the proccess is done you should see something like this:
|
||
|
|
||
|
<br>
|
||
|
==> Builds finished. The artifacts of successful builds are:
|
||
|
<br>
|
||
|
--> virtualbox-iso: 'virtualbox' provider box: ../../builds/ubuntu-18.04.virtualbox.box
|
||
|
<br>
|
||
|
Build 'virtualbox-iso' finished after 1 hour 30 minutes 28 seconds
|
||
|
</p>
|
||
|
|
||
|
|
||
|
</div> <!-- col -->
|
||
|
</div> <!-- row -->
|
||
|
</b-container fluid>
|
||
|
`
|
||
|
this.$swal({
|
||
|
type: 'info',
|
||
|
html: info,
|
||
|
icon: 'info',
|
||
|
showCloseButton: true,
|
||
|
showLoaderOnConfirm: false,
|
||
|
allowOutsideClick: false,
|
||
|
cancelButtonText: 'No, cancel!',
|
||
|
showCancelButton: false,
|
||
|
showLoaderOnConfirm: false,
|
||
|
reverseButtons: true,
|
||
|
focusCancel: false,
|
||
|
confirmButtonText: 'ok! '
|
||
|
})
|
||
|
}else {
|
||
|
console.log('no')
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
|
||
|
|
||
|
actions: {
|
||
|
|
||
|
}
|
||
|
|
||
|
};
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss">
|
||
|
|
||
|
|
||
|
|
||
|
.flex-fixed-width-item {
|
||
|
flex: 0 0 100px;
|
||
|
}
|
||
|
.modalinfo {
|
||
|
z-index: 10000000 !important;
|
||
|
position:fixed;
|
||
|
}
|
||
|
/* a container with flex-direction column */
|
||
|
|
||
|
.vue-notifyjs.notifications{
|
||
|
.alert{
|
||
|
z-index: 100;
|
||
|
}
|
||
|
.list-move {
|
||
|
transition: transform 0.3s, opacity 0.4s;
|
||
|
}
|
||
|
.list-item {
|
||
|
display: inline-block;
|
||
|
margin-right: 10px;
|
||
|
|
||
|
}
|
||
|
.list-enter-active {
|
||
|
transition: transform 0.2s ease-in, opacity 0.4s ease-in;
|
||
|
}
|
||
|
.list-leave-active {
|
||
|
transition: transform 1s ease-out, opacity 0.4s ease-out;
|
||
|
}
|
||
|
|
||
|
.list-enter {
|
||
|
opacity: 0;
|
||
|
transform: scale(1.1);
|
||
|
|
||
|
}
|
||
|
.list-leave-to {
|
||
|
opacity: 0;
|
||
|
transform: scale(1.2, 0.7);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pre {
|
||
|
//background-color: rgb(255, 247, 229);
|
||
|
background-color: #eff0f1;
|
||
|
border: 1px solid blue;
|
||
|
//white-space: pre-line;
|
||
|
}
|
||
|
|
||
|
|
||
|
</style>
|