diff --git a/docs/hybrid-1.png b/docs/hybrid-1.png
new file mode 100644
index 0000000..3e90bd6
Binary files /dev/null and b/docs/hybrid-1.png differ
diff --git a/docs/hybrid.png b/docs/hybrid.png
new file mode 100644
index 0000000..78284fd
Binary files /dev/null and b/docs/hybrid.png differ
diff --git a/docs/swarmlab-hybrid.adoc b/docs/swarmlab-hybrid.adoc
new file mode 100644
index 0000000..e673b33
--- /dev/null
+++ b/docs/swarmlab-hybrid.adoc
@@ -0,0 +1,103 @@
+= SwarmlabHybrid !
+Apostolos rootApostolos@swarmlab.io
+// Metadata:
+:description: Intro and Install
+:keywords: ubuntu install
+:data-uri:
+:toc: right
+:toc-title: Table of contents
+:toclevels: 4
+:source-highlighter: highlight
+:icons: font
+:sectnums:
+
+
+
+{empty} +
+
+image:./hybrid.png[alt="SwarmlabHybrid"]
+
+== Install
+
+
+=== Prerequisites Hardware
+
+[NOTE]
+.Remember
+====
+Before you create and configure a hybrid deployment using the swarmlab-agent client, your Local Machines need to meet certain requirements.
+
+If you don't meet those requirements, you won't be able to complete the steps within the swarmlab-agent client
+and you won't be able to configure a hybrid deployment between your Local Enviroment and Swarmlab Online Enviroment.
+====
+
+* A Linux Server (Virtual or Physical)
+** You must have super user privileges (sudo)
+
+* Docker Engine- Community version 18 or later is required.
+** Docker Engine is supported on x86_64 (or amd64), armhf, and arm64 architectures.
+
+* RAM
+** Absolute minimum to run the daemon and some very light containers - 512MB
+** Minimum for “comfortable” usage – 2GB
+
+* CPU
+** Minimum: 2; Recommended 4+.
+
+* Disk Space
+** 10 GB for internal requirements.
+** The amount of additional disk space required for load file staging, persistence, or backups depends on the size of the data to be loaded.
+
+TIP: Docker uses a hypervisor with a VM, and the host server must support virtualization.
+
+=== Prerequisites Keys
+
+* Create an Hybrid Swarmlab Key
+** Connect to https://api-client.swarmlab.io:8088/ and click on the Dashboard->Profile Menou
+* After creating Keys for your project, you will be informed with an email and it will also become visible in the Swarmlab-agent clients corresponding menu.
+
+=== Download and install
+
+* Download the swarmlab-agent client
+** git clone https://git.swarmlab.io:3000/zeus/swarmlab-hybrid.git
+
+* Run sudo ./install.sh
+** See also ./install directory
+
+== Start/Stop Agent
+
+=== Start Agent
+* Navigate to the dir you have installed the agent
+** run ./start.sh
+
+=== Stop Agent
+* Navigate to the dir you have installed the agent
+** run ./stop.sh
+
+=== Login
+
+Connect to https://api-client.swarmlab.io:8088/ and click on "Hybrid->OpenSwarmlab Hybrid" Menou
+
+TIP: This is the way to have a fully functional Swarmlab Cloud. You HAVE to connect this way to be Authorized for the session.
+
+== Config
+
+* Use the "Profile->Settings” menu on swarmlab-agent client to configure a hybrid agent
+** add also a zone for your agent
+
+
+** Connect to https://api-client.swarmlab.io:8088/ and click on the Dashboard->Profile Menou
+
+== Deploy
+
+=== Local
+
+=== Hybrid
+
+== Join
+
+== Connect to Container
+
+
+
+
diff --git a/src/components/manageservices/join-service.vue b/src/components/manageservices/join-service.vue
index 2c55a60..222c31a 100644
--- a/src/components/manageservices/join-service.vue
+++ b/src/components/manageservices/join-service.vue
@@ -210,6 +210,7 @@
detail-row-id="id"
@vuetable:pagination-data="onPaginationData"
@vuetable:load-success="loadsuccess"
+ @vuetable:load-error="onLoadError"
:css="css.table"
>
@@ -675,7 +676,24 @@ export default {
this.fielddata=data
var n = data.length
n=n-1
+ //console.log('data1 '+JSON.stringify(response))
},
+ onLoadError(payload) {
+ /*
+ //error2 "invalid_token" join-service.vue:684
+ //error2 "The access token provided has expired" join-service.vue:685
+ //error2 "Unauthorized" join-service.vue:686
+ //error2 401
+ console.log('error2 '+JSON.stringify(payload.response.data.error))
+ console.log('error2 '+JSON.stringify(payload.response.data.error_description))
+ console.log('error2 '+JSON.stringify(payload.response.statusText))
+ console.log('error2 '+JSON.stringify(payload.response.status))
+ */
+ if(payload.response.status == '401'){
+ window.location.href = 'https://api-login.swarmlab.io:8089';
+ Vue.nextTick( () => window.location.href = 'https://api-login.swarmlab.io:8089')
+ }
+ }
},
diff --git a/src/components/manageservices/manage-service.vue b/src/components/manageservices/manage-service.vue
index 015563a..5c68891 100644
--- a/src/components/manageservices/manage-service.vue
+++ b/src/components/manageservices/manage-service.vue
@@ -202,6 +202,7 @@
detail-row-id="id"
@vuetable:pagination-data="onPaginationData"
@vuetable:load-success="loadsuccess"
+ @vuetable:load-error="onLoadError"
:css="css.table"
>
@@ -620,6 +621,22 @@ export default {
var n = data.length
n=n-1
},
+ onLoadError(payload) {
+ /*
+ //error2 "invalid_token" join-service.vue:684
+ //error2 "The access token provided has expired" join-service.vue:685
+ //error2 "Unauthorized" join-service.vue:686
+ //error2 401
+ console.log('error2 '+JSON.stringify(payload.response.data.error))
+ console.log('error2 '+JSON.stringify(payload.response.data.error_description))
+ console.log('error2 '+JSON.stringify(payload.response.statusText))
+ console.log('error2 '+JSON.stringify(payload.response.status))
+ */
+ if(payload.response.status == '401'){
+ window.location.href = 'https://api-login.swarmlab.io:8089';
+ Vue.nextTick( () => window.location.href = 'https://api-login.swarmlab.io:8089')
+ }
+ }
},
diff --git a/src/components/manageservices/view-service.vue b/src/components/manageservices/view-service.vue
index a2193a8..2ad302d 100644
--- a/src/components/manageservices/view-service.vue
+++ b/src/components/manageservices/view-service.vue
@@ -208,6 +208,7 @@
detail-row-id="id"
@vuetable:pagination-data="onPaginationData"
@vuetable:load-success="loadsuccess"
+ @vuetable:load-error="onLoadError"
:css="css.table"
>
@@ -545,6 +546,22 @@ export default {
var n = data.length
n=n-1
},
+ onLoadError(payload) {
+ /*
+ //error2 "invalid_token" join-service.vue:684
+ //error2 "The access token provided has expired" join-service.vue:685
+ //error2 "Unauthorized" join-service.vue:686
+ //error2 401
+ console.log('error2 '+JSON.stringify(payload.response.data.error))
+ console.log('error2 '+JSON.stringify(payload.response.data.error_description))
+ console.log('error2 '+JSON.stringify(payload.response.statusText))
+ console.log('error2 '+JSON.stringify(payload.response.status))
+ */
+ if(payload.response.status == '401'){
+ window.location.href = 'https://api-login.swarmlab.io:8089';
+ Vue.nextTick( () => window.location.href = 'https://api-login.swarmlab.io:8089')
+ }
+ }
},
diff --git a/src/components/mynetwork/availableservices.vue b/src/components/mynetwork/availableservices.vue
index 72d0e2a..26caa18 100644
--- a/src/components/mynetwork/availableservices.vue
+++ b/src/components/mynetwork/availableservices.vue
@@ -116,6 +116,7 @@
detail-row-id="id"
@vuetable:pagination-data="onPaginationData"
@vuetable:load-success="loadsuccess"
+ @vuetable:load-error="onLoadError"
:css="css.table"
>
@@ -572,6 +573,22 @@ export default {
var n = data.length
n=n-1
},
+ onLoadError(payload) {
+ /*
+ //error2 "invalid_token" join-service.vue:684
+ //error2 "The access token provided has expired" join-service.vue:685
+ //error2 "Unauthorized" join-service.vue:686
+ //error2 401
+ console.log('error2 '+JSON.stringify(payload.response.data.error))
+ console.log('error2 '+JSON.stringify(payload.response.data.error_description))
+ console.log('error2 '+JSON.stringify(payload.response.statusText))
+ console.log('error2 '+JSON.stringify(payload.response.status))
+ */
+ if(payload.response.status == '401'){
+ window.location.href = 'https://api-login.swarmlab.io:8089';
+ Vue.nextTick( () => window.location.href = 'https://api-login.swarmlab.io:8089')
+ }
+ }
},
diff --git a/src/components/mynetwork/dockerservices.vue b/src/components/mynetwork/dockerservices.vue
index 679c832..2f8fee8 100644
--- a/src/components/mynetwork/dockerservices.vue
+++ b/src/components/mynetwork/dockerservices.vue
@@ -61,6 +61,7 @@
detail-row-id="id"
@vuetable:pagination-data="onPaginationData"
@vuetable:load-success="loadsuccess"
+ @vuetable:load-error="onLoadError"
:css="css.table"
>
@@ -343,6 +344,22 @@ export default {
var n = data.length
n=n-1
},
+ onLoadError(payload) {
+ /*
+ //error2 "invalid_token" join-service.vue:684
+ //error2 "The access token provided has expired" join-service.vue:685
+ //error2 "Unauthorized" join-service.vue:686
+ //error2 401
+ console.log('error2 '+JSON.stringify(payload.response.data.error))
+ console.log('error2 '+JSON.stringify(payload.response.data.error_description))
+ console.log('error2 '+JSON.stringify(payload.response.statusText))
+ console.log('error2 '+JSON.stringify(payload.response.status))
+ */
+ if(payload.response.status == '401'){
+ window.location.href = 'https://api-login.swarmlab.io:8089';
+ Vue.nextTick( () => window.location.href = 'https://api-login.swarmlab.io:8089')
+ }
+ }
},