Improved and fixed connection to XDS Server
authorSebastien Douheret <sebastien.douheret@iot.bzh>
Fri, 24 Nov 2017 13:21:37 +0000 (14:21 +0100)
committerSebastien Douheret <sebastien.douheret@iot.bzh>
Fri, 24 Nov 2017 14:25:44 +0000 (15:25 +0100)
Signed-off-by: Sebastien Douheret <sebastien.douheret@iot.bzh>
lib/agent/apiv1-version.go
webapp/src/app/@core-xds/services/xds-config.service.ts
webapp/src/app/pages/config/config-xds/config-xds.component.html
webapp/src/app/pages/config/config-xds/config-xds.component.scss
webapp/src/app/pages/config/config-xds/config-xds.component.ts
webapp/tslint.json

index c75e7f5..c73010e 100644 (file)
@@ -1,11 +1,11 @@
 package agent
 
 import (
+       "fmt"
        "net/http"
 
        "github.com/gin-gonic/gin"
        "github.com/iotbzh/xds-agent/lib/apiv1"
-       common "github.com/iotbzh/xds-common/golib"
 )
 
 // getInfo : return various information about server
@@ -23,8 +23,10 @@ func (s *APIService) getVersion(c *gin.Context) {
        for _, svr := range s.xdsServers {
                res := apiv1.VersionData{}
                if err := svr.GetVersion(&res); err != nil {
-                       common.APIError(c, "Cannot retrieve version of XDS server ID %s : %v", svr.ID, err.Error())
-                       return
+                       errMsg := fmt.Sprintf("Cannot retrieve version of XDS server ID %s : %v", svr.ID, err.Error())
+                       s.Log.Warning(errMsg)
+                       res.ID = svr.ID
+                       res.Version = errMsg
                }
                svrVer = append(svrVer, res)
        }
index 2f751a7..2a43f2b 100644 (file)
@@ -74,9 +74,10 @@ export class XDSConfigService {
     return Observable.of(curSvr);
   }
 
-  private _updateCurServer() {
+  private _updateCurServer(): IXDServerCfg {
     this._curServer = this._getCurServer();
     this.curServer$.next(this._curServer);
+    return this._curServer;
   }
 
   private _getCurServer(url?: string): IXDServerCfg {
index 31559e2..ebfaa36 100644 (file)
@@ -7,28 +7,30 @@
           <div class="form-group row">
             <label class="col-sm-3 col-form-label">XDS Server URL</label>
             <div class="col-sm-8">
-              <input type="url" class="form-control" [ngClass]="{ 'form-control-danger': !server.connected }" id="inputServerUrl" [(ngModel)]="xdsServerUrl" name="serverUrl" (ngModelChange)="configFormChanged=true" [disabled]="connecting">
+              <input type="url" class="form-control" [ngClass]="{ 'form-control-danger': !server?.connected }" id="inputServerUrl" [(ngModel)]="xdsServerUrl" name="serverUrl" (ngModelChange)="configFormChanged=true" [disabled]="applying">
             </div>
             <div class="col-sm-1">
-              <span *ngIf="!connecting" class="fa fa-fw fa-exchange fa-size-x2 vcenter" [style.color]="server.connected?'green':'red'"></span>
-              <span *ngIf="connecting" class="fa fa-gear faa-spin animated fa-size-x2 vcenter"></span>
+              <span class="fa fa-fw fa-exchange faa-burst fa-size-x2 vcenter" [ngClass]="{'animated': applying}" [style.color]="(server?.connected && !animated)?'green':'red'" ></span>
             </div>
           </div>
           <div class="form-group row">
             <label class="col-sm-3 col-form-label">XDS Server connection retry</label>
-            <div class="col-sm-8">
+            <div class="col-sm-8" *ngIf="server">
               <input type="number" class="form-control" id="inputServerConnRetry" [(ngModel)]="server.connRetry" name="serverRetry" (ngModelChange)="configFormChanged=true">
             </div>
           </div>
-
-          <div class="form-group row">
-            <div class="offset-sm-3 col-sm-9">
-              <button type="submit" class="btn btn-primary" [disabled]="
-              connecting || (server.connected && !configFormChanged)">Apply</button>
-            </div>
-          </div>
         </form>
       </nb-card-body>
+      <nb-card-footer>
+        <div class="col-12">
+          <div class="offset-sm-5 col-sm-2">
+            <button class="btn btn-primary" (click)="onSubmit()" [disabled]="
+            applying || (server?.connected && !configFormChanged)">{{ applying ?"Applying... ":"Apply" }}
+            <span *ngIf="applying" class="fa fa-gear faa-spin animated fa-size-x2"></span>
+          </button>
+          </div>
+        </div>
+      </nb-card-footer>
     </nb-card>
   </div>
 </div>
index d7571b9..027f0fc 100644 (file)
@@ -16,7 +16,7 @@ nb-card.inline-form-card nb-card-body {
 }
 
 .fa-size-x2 {
-  font-size: 20px;
+  font-size: 22px;
 }
 
 .vcenter {
index ffd236d..396115b 100644 (file)
@@ -15,10 +15,10 @@ import 'rxjs/add/operator/catch';
   styleUrls: ['./config-xds.component.scss'],
   templateUrl: './config-xds.component.html',
 })
-export class ConfigXdsComponent implements OnInit {
+export class ConfigXdsComponent {
 
   // TODO: cleanup agentStatus$: Observable<IAgentStatus>;
-  connecting = false;
+  applying = false;
   xdsServerUrl = '';
   server: IXDServerCfg;
 
@@ -28,17 +28,10 @@ export class ConfigXdsComponent implements OnInit {
     private XdsConfigSvr: XDSConfigService,
     private alert: AlertService,
   ) {
-  }
-
-  ngOnInit() {
     // FIXME support multiple servers
-
-    this.server = this.XdsConfigSvr.getCurServer();
-    this.xdsServerUrl = this.server.url;
-
     this.XdsConfigSvr.onCurServer().subscribe(svr => {
       this.xdsServerUrl = svr.url;
-      this.server = svr;
+      this.server = Object.assign({}, svr);
     });
   }
 
@@ -47,14 +40,16 @@ export class ConfigXdsComponent implements OnInit {
       return;
     }
     this.configFormChanged = false;
-    this.connecting = true;
+    this.applying = true;
     this.server.url = this.xdsServerUrl;
     this.XdsConfigSvr.setCurServer(this.server)
       .subscribe(cfg => {
-        this.connecting = false;
-       },
+        this.alert.info('XDS Server successfully connected (' + cfg.url + ')');
+        this.server = Object.assign({}, cfg);
+        this.applying = false;
+      },
       err => {
-        this.connecting = false;
+        this.applying = false;
         this.alert.error(err);
       });
   }
index 6cd34e9..9bfdcb2 100644 (file)
     "use-pipe-transform-interface": true,
     "component-class-suffix": true,
     "directive-class-suffix": true,
-    "no-access-missing-member": true,
+    "no-access-missing-member": false,
     "templates-use-public": true,
     "invoke-injectable": true
   }