Browse Source

add network

master
zeus 3 years ago
parent
commit
5541176763
  1. BIN
      dist/img/dockernetwork.f3bb6fa3.png
  2. 2
      dist/index.html
  3. 2
      dist/js/app.45012763.js
  4. 1
      dist/js/app.45012763.js.map
  5. 2
      dist/js/app.77237a5d.js
  6. 1
      dist/js/app.77237a5d.js.map
  7. 183
      src-local/llo/new.js
  8. BIN
      src/assets/img/dockernetwork.png
  9. BIN
      src/assets/img/dockernetwork.xcf
  10. 2
      src/components/mynetwork/AdhocView.vue
  11. 34
      src/components/mynetwork/availableservices.vue
  12. 7
      src/components/mynetwork/dockerservices.vue
  13. 130
      src/components/mynetwork/mytable.vue
  14. 63
      src/store/modules/create_pipelineLLO.js

BIN
dist/img/dockernetwork.f3bb6fa3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

2
dist/index.html

@ -1 +1 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Vue App</title><link href="/css/app.2301b4fb.css" rel="preload" as="style"><link href="/css/chunk-vendors.e469b508.css" rel="preload" as="style"><link href="/js/app.77237a5d.js" rel="preload" as="script"><link href="/js/chunk-vendors.d8d18fe6.js" rel="preload" as="script"><link href="/css/chunk-vendors.e469b508.css" rel="stylesheet"><link href="/css/app.2301b4fb.css" rel="stylesheet"></head><body><div id="app"></div><script src="/js/chunk-vendors.d8d18fe6.js"></script><script src="/js/app.77237a5d.js"></script></body></html> <!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Vue App</title><link href="/css/app.2301b4fb.css" rel="preload" as="style"><link href="/css/chunk-vendors.e469b508.css" rel="preload" as="style"><link href="/js/app.45012763.js" rel="preload" as="script"><link href="/js/chunk-vendors.d8d18fe6.js" rel="preload" as="script"><link href="/css/chunk-vendors.e469b508.css" rel="stylesheet"><link href="/css/app.2301b4fb.css" rel="stylesheet"></head><body><div id="app"></div><script src="/js/chunk-vendors.d8d18fe6.js"></script><script src="/js/app.45012763.js"></script></body></html>

2
dist/js/app.45012763.js

File diff suppressed because one or more lines are too long

1
dist/js/app.45012763.js.map

File diff suppressed because one or more lines are too long

2
dist/js/app.77237a5d.js

File diff suppressed because one or more lines are too long

1
dist/js/app.77237a5d.js.map

File diff suppressed because one or more lines are too long

183
src-local/llo/new.js

@ -75,7 +75,7 @@ const io = require("socket.io")(server, {
}); });
const { spawn, exec } = require('child_process') const { spawn, exec, execSync } = require('child_process')
const simpleGit = require('simple-git'); const simpleGit = require('simple-git');
@ -811,22 +811,169 @@ app.get('/getstoragestatus', (req, res, next) => {
}); });
app.get('/getnetworks', (req, res, next) => {
var RES = new Object();
var instancejson = JSON.parse(req.query["instance"])
var instance = instancejson.instance
var datajson1 = ''
//console.log(JSON.stringify(instancejson))
var showexec1 = `docker inspect ${instance} --format '{{json .HostConfig.NetworkMode}}' | jq . -s`
exec(showexec1, (err1, stdout1, stderr1) => {
if (err1) {
return;
}
if (stdout1) {
var string1 = stdout1.toString()
datajson1 = JSON.parse(string1);
//console.log(JSON.stringify(datajson1))
var showexec = `docker network ls --format '{{json .}}' | jq . -s`
exec(showexec, (err, stdout, stderr) => {
if (err) {
return;
}
if (stdout) {
var string = stdout.toString()
var datajson = JSON.parse(string);
var networks = []
var extenderror = new RegExp('^hybrid-');
for(var i = 0; i < datajson.length; i++) {
var NET = {}
var servicename = datajson[i].Name
if(extenderror.test(servicename)){
NET.ID = datajson[i].ID
NET.Name = datajson[i].Name
NET.NetworkMode = datajson1
NET.Scope = datajson[i].Scope
NET.Internal = datajson[i].Internal
NET.IPv6 = datajson[i].IPv6
networks.push(NET)
}
}
var extenderror1 = new RegExp('^storage-');
for(var i = 0; i < datajson.length; i++) {
var NET = {}
var servicename1 = datajson[i].Name
if(extenderror1.test(servicename1)){
NET.ID = datajson[i].ID
NET.Name = datajson[i].Name
NET.NetworkMode = datajson1
NET.Scope = datajson[i].Scope
NET.Internal = datajson[i].Internal
NET.IPv6 = datajson[i].IPv6
networks.push(NET)
}
}
RES.error = false
RES.error_msg = "ok"
RES.data = networks;
res.json(RES)
}else{
var found = 'no'
RES.error = false
RES.error_msg = "ok"
RES.data = 'no network';
res.json(RES)
}
}); //var showexec = `docker network ls --format '{{json .}}' | jq . -s
} // if exec(showexec1
}); // exec(showexec1
});
app.post('/updatenetworks', (req, res, next) => {
var RES = new Object();
const network = req.body["network"]
const container = req.body["container"]
var defaultnetwork = req.body["defaultnetwork"]
var execerror = 0
var execerror1 = 0
//console.log(JSON.stringify(defaultnetwork))
var showexec = `docker inspect ${container} --format '{{json .NetworkSettings.Networks}}' | jq . -s`
exec(showexec, (err, stdout, stderr) => {
if (err) {
return;
}
if (stdout) {
var string = stdout.toString()
var datajson = JSON.parse(string);
var NET1 = []
for (const property in datajson[0]) {
var NET = {}
var name = property
NET1.push(NET)
if(property.trim() !== defaultnetwork.trim()){
try {
var showexecrm = `docker network disconnect ${property} ${container} -f`
//console.log(`${showexecrm}`);
execSync(showexecrm);
execerror = 1
var n = {}
n.data = `rm ${property} from ${container}`
io.emit('message_close', n);
} catch (error) {
execerror = 2
var n = {}
n.data = `rm ${error}`
io.emit('message_close', n);
}
}
//console.log(`${property}`);
}
for(var i = 0; i < network.length; i++) {
try {
var showexecadd = `docker network connect ${network[i]} ${container}`
execSync(showexecadd);
var n = {}
n.data = `add ${network[i]} to ${container}`
io.emit('message_close', n);
execerror1 = 1
} catch (error) {
var n = {}
n.data = `add ${error}`
io.emit('message_close', n);
execerror1 = 2
}
}
RES.error = false
RES.error_msg = "ok"
RES.network = NET1
RES.datarm = execerror
RES.dataadd = execerror1
res.json(RES)
}else{
RES.error = false
RES.error_msg = "ok"
RES.data = 'no network';
res.json(RES)
}
}); // exec(showexec1
});
app.get('/rm_swarmlab', (req, res, next) => { app.get('/rm_swarmlab', (req, res, next) => {
var mypath = process.cwd() var mypath = process.cwd()
var RES = new Object(); var RES = new Object();
RES.instance = req.query["instance"] RES.instance = req.query["instance"]
var services_path = './instance/'+RES.instance var services_path = './instance/'+RES.instance
docker_image_rm(mypath, RES.instance);
fs.rm(services_path, { fs.rm(services_path, {
recursive: true, recursive: true,
force: true force: true
}, (error) => { }, (error) => {
if (error) { if (error) {
RES.error = true RES.error = true
RES.path = mypath
RES.error_msg = "no" RES.error_msg = "no"
res.json(RES) res.json(RES)
} else { } else {
RES.error = false RES.error = false
RES.path = mypath
RES.error_msg = "ok" RES.error_msg = "ok"
res.json(RES) res.json(RES)
} }
@ -839,16 +986,19 @@ app.get('/rm_swarmlabstorage', (req, res, next) => {
var RES = new Object(); var RES = new Object();
RES.instance = req.query["instance"] RES.instance = req.query["instance"]
var services_path = './instance/'+RES.instance var services_path = './instance/'+RES.instance
docker_image_rm(mypath, RES.instance);
fs.rm(services_path, { fs.rm(services_path, {
recursive: true, recursive: true,
force: true force: true
}, (error) => { }, (error) => {
if (error) { if (error) {
RES.error = true RES.error = true
RES.path = mypath
RES.error_msg = "no" RES.error_msg = "no"
res.json(RES) res.json(RES)
} else { } else {
RES.error = false RES.error = false
RES.path = mypath
RES.error_msg = "ok" RES.error_msg = "ok"
res.json(RES) res.json(RES)
} }
@ -1090,6 +1240,37 @@ function create_project(swarmlabname,project){
}); });
} }
function docker_image_rm(swarmlabname,project){
var services_path = swarmlabname
var service_rm = 'docker rmi $(docker images --format "{{.Repository}}#{{ .ID }}" | grep "/'+project+'#" | cut -d"#" -f2)'
console.log('docker rmi '+service_rm)
remove = spawn(service_rm, {
shell: true,
cwd: services_path,
detached: false,
stdio: 'pipe'
});
remove.stdout.on('data', function (data) {
var n = {}
n.data = data.toString()
io.emit('message_out', n);
});
remove.stderr.on('data', function (data) {
var n = {}
n.data = data.toString()
io.emit('message_err', n);
});
remove.on('close', function (code) {
var n = {}
n.data = code
io.emit('message_close', n);
});
}
function myserverStatus(){ function myserverStatus(){
var serverStatus = '/bin/bash ./hybrid/connect/status.sh swarmlab0'; var serverStatus = '/bin/bash ./hybrid/connect/status.sh swarmlab0';
exec(serverStatus, (err, stdout, stderr) => { exec(serverStatus, (err, stdout, stderr) => {

BIN
src/assets/img/dockernetwork.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
src/assets/img/dockernetwork.xcf

Binary file not shown.

2
src/components/mynetwork/AdhocView.vue

@ -192,7 +192,7 @@ export default {
cmOptions: { cmOptions: {
tabSize: 2, tabSize: 2,
styleActiveLine: true, styleActiveLine: true,
lineNumbers: false, lineNumbers: true,
lineSeparator:'\n', lineSeparator:'\n',
line: true, line: true,
foldGutter: true, foldGutter: true,

34
src/components/mynetwork/availableservices.vue

@ -479,11 +479,43 @@ export default {
this.$wait.start('myRunInstancetutor'); this.$wait.start('myRunInstancetutor');
var res = await store.dispatch('pipelineLLO/rmswarmlablocal', this.hybridoptions.swarmlabname) var res = await store.dispatch('pipelineLLO/rmswarmlablocal', this.hybridoptions.swarmlabname)
this.$wait.end('myRunInstancetutor'); this.$wait.end('myRunInstancetutor');
var obj = {}
obj.token = this.token
obj.instance = data.swarmlabname
//check if exists
var res2 = await store.dispatch('pipelineLLO/getservicesinfo', obj)
if(res2.data.data == 'yes'){
if(res2.data.data == 'yes'){
var winfo='<h6 class="text-warning"> swarmlab encountered a problem while deleting your labroom files. <br> This propably means that you have created some files while operating the labroom. <br> To remove those files please run the following command as root. </h6> <h5><i>Copy-and-run-command </i></h5><br> '
winfo += '<span class="text-success">sudo rm -rf '+res.data.path+'/instance/'+data.swarmlabname+' </span><br><br>'
winfo += '<span class="text-secondary"> You can back up content using: </span><br>'
winfo += '<span class="text-warning">sudo tar -zcvf /home/\$USER/swarmlabbackup_'+data.swarmlabname+'.tar.gz '+res.data.path+'/instance/'+data.swarmlabname+' </span>'
var info='<h5>Labroom remove</h5>'
this.$swal({
type: 'info',
html: info+winfo,
icon: 'info',
showCloseButton: true,
showLoaderOnConfirm: false,
allowOutsideClick: false,
cancelButtonText: 'No, cancel!',
showCancelButton: false,
showLoaderOnConfirm: false,
reverseButtons: true,
focusCancel: true,
confirmButtonText: 'Ok!'
})
console.log('inf res11111111111 '+ JSON.stringify(res.data.path))
}
}
//Vue.nextTick( () => this.$refs.vuetable.refresh()) //Vue.nextTick( () => this.$refs.vuetable.refresh())
Vue.delete(this.testactionrowindex, data.swarmlabname) Vue.delete(this.testactionrowindex, data.swarmlabname)
this.refreshVuetable() this.refreshVuetable()
this.$root.$emit('hybrid_refresh_info_deploy_local') this.$root.$emit('hybrid_refresh_info_deploy_local')
//console.log('inf res '+ JSON.stringify(res))
}else if(action == 'run-install' ){ }else if(action == 'run-install' ){
this.$wait.start('myRunInstancetutor'); this.$wait.start('myRunInstancetutor');
this.hybridoptions.swarmlabname = data.swarmlabname this.hybridoptions.swarmlabname = data.swarmlabname

7
src/components/mynetwork/dockerservices.vue

@ -233,6 +233,12 @@ export default {
} }
}, },
mounted() { mounted() {
this.$root.$on('hybrid_refresh_networktable', () => {
//this.setFilter()
//this.$refs.vuetable.refresh()
Vue.nextTick( () => this.$refs.vuetable.refresh())
this.refreshVuetable()
})
this.$root.$on('hybrid_refresh_dockerservices', () => { this.$root.$on('hybrid_refresh_dockerservices', () => {
//this.setFilter() //this.setFilter()
//this.$refs.vuetable.refresh() //this.$refs.vuetable.refresh()
@ -255,6 +261,7 @@ export default {
}, },
beforeDestroy () { beforeDestroy () {
this.$root.$off('hybrid_refresh_networktable')
this.$root.$off('hybrid_refresh_dockerservices') this.$root.$off('hybrid_refresh_dockerservices')
this.$root.$off('hybrid_refresh_table') this.$root.$off('hybrid_refresh_table')
}, },

130
src/components/mynetwork/mytable.vue

@ -94,12 +94,14 @@
</div> </div>
</div> <!-- row --> </div> <!-- row -->
<div class="row" > <div class="row" >
<div class="col-2 text-info" > <div class="col-2 text-info" >
Networks Status
</div> </div>
<div class="col-3 text-secondary" > <div class="col-3 text-secondary" >
{{ hybridshowdata.Networks }} {{ hybridshowdata.Status }}
</div> </div>
<div class="col-2 text-info" > <div class="col-2 text-info" >
CreatedAt CreatedAt
</div> </div>
@ -108,12 +110,29 @@
</div> </div>
</div> <!-- row --> </div> <!-- row -->
<div class="row" > <div class="row" >
<div class="col-2 text-info" > <div class="col-2 text-info" >
Status <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>
<div class="col-3 text-secondary" > <div class="col-3 text-secondary" >
{{ hybridshowdata.Status }} {{ hybridshowdata.Networks }}
</div> </div>
<div class="col-2 text-info" > <div class="col-2 text-info" >
Ports Ports
</div> </div>
@ -126,6 +145,51 @@
"Networks":"{{.Networks}}", "Status":"{{.Status}}","RunningFor":"{{.RunningFor}}","CreatedAt":"{{.CreatedAt}}"}' "Networks":"{{.Networks}}", "Status":"{{.Status}}","RunningFor":"{{.RunningFor}}","CreatedAt":"{{.CreatedAt}}"}'
--> -->
</b-container> </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> </card>
</template> </template>
<script> <script>
@ -154,6 +218,11 @@ export default {
}, },
data() { data() {
return{ return{
addNetworkMenou:false,
localNetworks:[],
selectedNetworks:[],
localNetworkoptions:[],
localNetworkdefault:'',
STATUS:{}, STATUS:{},
CONFIG:{ CONFIG:{
'status':'', 'status':'',
@ -194,6 +263,11 @@ export default {
this.$root.$on('hybrid_show_info', (data) => { this.$root.$on('hybrid_show_info', (data) => {
this.$nextTick(function () { this.$nextTick(function () {
this.hybridshowdata = data this.hybridshowdata = data
this.addNetworkMenou = false
this.localNetworks = []
this.selectedNetworks = []
this.localNetworkoptions = []
this.localNetworkdefault = ''
//console.log(JSON.stringify(this.hybridshowdata)) //console.log(JSON.stringify(this.hybridshowdata))
}) })
}) })
@ -285,6 +359,54 @@ export default {
}, },
methods: { methods: {
async updateNetwork(container,action){
console.log(JSON.stringify(container));
console.log(JSON.stringify('selected :' + this.selectedNetworks));
var log = await store.dispatch("pipelineLLO/updatenetworks",{
networks:this.selectedNetworks,
defaultnetwork:this.localNetworkdefault,
container:container.ID
})
this.$root.$emit('hybrid_refresh_networktable')
this.hybridshowdata = {}
this.addNetworkMenou = false
this.localNetworks = []
this.selectedNetworks = []
this.localNetworkoptions = []
this.localNetworkdefault = ''
console.log(JSON.stringify(log.data.data));
},
async addNetwork(container,action){
if(action == 'on'){
this.addNetworkMenou = true
var log = await store.dispatch("pipelineLLO/getnetworks",{
instance:container.ID
})
this.localNetworks = log.data.data
var searchnet = ''
this.localNetworkoptions = []
for(var i = 0; i < this.localNetworks.length; i++) {
this.localNetworkdefault = this.localNetworks[i].NetworkMode[0]
var NET = {}
NET.text = this.localNetworks[i].Name
NET.value = this.localNetworks[i].Name
searchnet = new RegExp(this.localNetworks[i].NetworkMode[0]);
//console.log(this.localNetworks[i].NetworkMode[0] +' - ' + this.localNetworks[i].Name );
if(searchnet.test(this.localNetworks[i].Name)){
NET.disabled = true
}else{
NET.disabled = false
}
this.localNetworkoptions.push(NET)
}
console.log(JSON.stringify(this.localNetworks));
}else if(action == 'off'){
this.addNetworkMenou = false
}
console.log(container);
},
async onAction(action){ async onAction(action){
if(action == 'start'){ if(action == 'start'){
var obj = {} var obj = {}

63
src/store/modules/create_pipelineLLO.js

@ -367,6 +367,69 @@ export default {
return R; return R;
} }
} }
},
async getnetworks({commit,rootGetters}, value) {
//console.log('value '+JSON.stringify(value))
try {
var token = value.token
var params = {
instance: value
}
var options = {
params: params,
headers: { 'content-type': 'application/x-www-form-urlencoded',Authorization: `Bearer ${token}` },
};
var sock_server_l = ApiConfig.url_80+'/getnetworks'
var p = await axios.get(sock_server_l,options);
//var p = await axios.get('https://localhost:3000/getservicesinfo',options);
return p
//console.log(JSON.stringify(p))
//console.log(value.token)
//console.log(value.swarmlabname)
} catch (e) {
if(e.message == "Request failed with status code 401" || /401/i.test(e.message)){
//console.log('error '+JSON.stringify(e))
window.location.href = 'https://api-login.swarmlab.io:8089';
}else{
var R = {
ERROR_str: e,
ERROR: 'yes'
}
return R;
}
}
},
async updatenetworks({commit,rootGetters}, value) {
//console.log('value '+JSON.stringify(value))
try {
var token = value.token
var params = {
network: value.networks,
defaultnetwork: value.defaultnetwork,
container: value.container
}
var options = {
//params: params,
headers: { 'content-type': 'application/json',Authorization: `Bearer ${token}` },
};
var sock_server_l = ApiConfig.url_80+'/updatenetworks'
var p = await axios.post(sock_server_l,params,options);
//var p = await axios.get('https://localhost:3000/get_config',options);
return p
} catch (e) {
if(e.message == "Request failed with status code 401" || /401/i.test(e.message)){
//console.log('error '+JSON.stringify(e))
//window.location.href = 'https://api-login.swarmlab.io:8089';
}else{
var R = {
ERROR_str: e,
ERROR: 'yes'
}
return R;
}
}
}, },
async getserviceshybridstatus({commit,rootGetters}, value) { async getserviceshybridstatus({commit,rootGetters}, value) {
//console.log('value '+JSON.stringify(value)) //console.log('value '+JSON.stringify(value))

Loading…
Cancel
Save