Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
小 白蛋
Harbor
Commits
7ccdce33
Commit
7ccdce33
authored
7 years ago
by
Wenkai Yin
Browse files
Options
Download
Email Patches
Plain Diff
Refactor ping target API
Merge ping target API by ID into ping target API
parent
13ffebcf
No related merge requests found
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
docs/swagger.yaml
+4
-25
docs/swagger.yaml
src/ui/api/harborapi_test.go
+0
-13
src/ui/api/harborapi_test.go
src/ui/api/target.go
+43
-34
src/ui/api/target.go
src/ui/api/target_test.go
+32
-56
src/ui/api/target_test.go
src/ui/router.go
+0
-1
src/ui/router.go
src/ui_ng/lib/src/create-edit-endpoint/create-edit-endpoint.component.html.ts
+7
-7
...eate-edit-endpoint/create-edit-endpoint.component.html.ts
src/ui_ng/lib/src/create-edit-endpoint/create-edit-endpoint.component.ts
+61
-75
...rc/create-edit-endpoint/create-edit-endpoint.component.ts
src/ui_ng/lib/src/service/endpoint.service.ts
+1
-11
src/ui_ng/lib/src/service/endpoint.service.ts
src/ui_ng/lib/src/service/interface.ts
+1
-0
src/ui_ng/lib/src/service/interface.ts
with
149 additions
and
222 deletions
+149
-222
docs/swagger.yaml
+
4
-
25
View file @
7ccdce33
...
...
@@ -1670,31 +1670,6 @@ paths:
description
:
Target not found.
'
500'
:
description
:
Unexpected internal errors.
'
/targets/{id}/ping'
:
post
:
summary
:
Ping target.
description
:
|
This endpoint is for ping target.
parameters
:
-
name
:
id
in
:
path
type
:
integer
format
:
int64
required
:
true
description
:
The replication's target ID.
tags
:
-
Products
responses
:
'
200'
:
description
:
Ping replication's target successfully.
'
400'
:
description
:
Can not ping target.
'
401'
:
description
:
User need to log in first.
'
404'
:
description
:
Target ID does not exist.
'
500'
:
description
:
Unexpected internal errors.
'
/targets/{id}'
:
put
:
summary
:
Update replication's target.
...
...
@@ -2512,6 +2487,10 @@ definitions:
PingTarget
:
type
:
object
properties
:
id
:
type
:
integer
format
:
int
description
:
Target ID.
endpoint
:
type
:
string
description
:
The target address URL string.
...
...
This diff is collapsed.
Click to expand it.
src/ui/api/harborapi_test.go
+
0
-
13
View file @
7ccdce33
...
...
@@ -118,7 +118,6 @@ func init() {
beego
.
Router
(
"/api/targets/:id([0-9]+)"
,
&
TargetAPI
{})
beego
.
Router
(
"/api/targets/:id([0-9]+)/policies/"
,
&
TargetAPI
{},
"get:ListPolicies"
)
beego
.
Router
(
"/api/targets/ping"
,
&
TargetAPI
{},
"post:Ping"
)
beego
.
Router
(
"/api/targets/:id([0-9]+)/ping"
,
&
TargetAPI
{},
"post:PingByID"
)
beego
.
Router
(
"/api/policies/replication/:id([0-9]+)"
,
&
RepPolicyAPI
{})
beego
.
Router
(
"/api/policies/replication"
,
&
RepPolicyAPI
{},
"get:List"
)
beego
.
Router
(
"/api/policies/replication"
,
&
RepPolicyAPI
{},
"post:Post;delete:Delete"
)
...
...
@@ -636,18 +635,6 @@ func (a testapi) PingTarget(authInfo usrInfo, body interface{}) (int, error) {
return
httpStatusCode
,
err
}
//PingTargetByID ...
func
(
a
testapi
)
PingTargetByID
(
authInfo
usrInfo
,
id
int
)
(
int
,
error
)
{
_sling
:=
sling
.
New
()
.
Post
(
a
.
basePath
)
path
:=
fmt
.
Sprintf
(
"/api/targets/%d/ping"
,
id
)
_sling
=
_sling
.
Path
(
path
)
httpStatusCode
,
_
,
err
:=
request
(
_sling
,
jsonAcceptHeader
,
authInfo
)
return
httpStatusCode
,
err
}
//Get target by targetID
func
(
a
testapi
)
GetTargetByID
(
authInfo
usrInfo
,
targetID
string
)
(
int
,
error
)
{
_sling
:=
sling
.
New
()
.
Get
(
a
.
basePath
)
...
...
This diff is collapsed.
Click to expand it.
src/ui/api/target.go
+
43
-
34
View file @
7ccdce33
...
...
@@ -84,48 +84,57 @@ func (t *TargetAPI) ping(endpoint, username, password string, insecure bool) {
}
}
// PingByID ping target by ID
func
(
t
*
TargetAPI
)
PingByID
()
{
id
:=
t
.
GetIDFromURL
()
target
,
err
:=
dao
.
GetRepTarget
(
id
)
if
err
!=
nil
{
log
.
Errorf
(
"failed to get target %d: %v"
,
id
,
err
)
t
.
CustomAbort
(
http
.
StatusInternalServerError
,
http
.
StatusText
(
http
.
StatusInternalServerError
))
}
if
target
==
nil
{
t
.
CustomAbort
(
http
.
StatusNotFound
,
fmt
.
Sprintf
(
"target %d not found"
,
id
))
}
endpoint
:=
target
.
URL
username
:=
target
.
Username
password
:=
target
.
Password
insecure
:=
target
.
Insecure
if
len
(
password
)
!=
0
{
password
,
err
=
utils
.
ReversibleDecrypt
(
password
,
t
.
secretKey
)
if
err
!=
nil
{
log
.
Errorf
(
"failed to decrypt password: %v"
,
err
)
t
.
CustomAbort
(
http
.
StatusInternalServerError
,
http
.
StatusText
(
http
.
StatusInternalServerError
))
}
}
t
.
ping
(
endpoint
,
username
,
password
,
insecure
)
}
// Ping validates whether the target is reachable and whether the credential is valid
func
(
t
*
TargetAPI
)
Ping
()
{
req
:=
struct
{
Endpoint
string
`json:"endpoint"`
Username
string
`json:"username"`
Password
string
`json:"password"`
Insecure
bool
`json:"insecure"`
ID
*
int64
`json:"id"`
Endpoint
*
string
`json:"endpoint"`
Username
*
string
`json:"username"`
Password
*
string
`json:"password"`
Insecure
*
bool
`json:"insecure"`
}{}
t
.
DecodeJSONReq
(
&
req
)
if
len
(
req
.
Endpoint
)
==
0
{
t
.
CustomAbort
(
http
.
StatusBadRequest
,
"endpoint is required"
)
target
:=
&
models
.
RepTarget
{}
if
req
.
ID
!=
nil
{
var
err
error
target
,
err
=
dao
.
GetRepTarget
(
*
req
.
ID
)
if
err
!=
nil
{
t
.
HandleInternalServerError
(
fmt
.
Sprintf
(
"failed to get target %d: %v"
,
*
req
.
ID
,
err
))
return
}
if
target
==
nil
{
t
.
HandleNotFound
(
fmt
.
Sprintf
(
"target %d not found"
,
*
req
.
ID
))
return
}
if
len
(
target
.
Password
)
!=
0
{
target
.
Password
,
err
=
utils
.
ReversibleDecrypt
(
target
.
Password
,
t
.
secretKey
)
if
err
!=
nil
{
t
.
HandleInternalServerError
(
fmt
.
Sprintf
(
"failed to decrypt password: %v"
,
err
))
return
}
}
}
if
req
.
Endpoint
!=
nil
{
target
.
URL
=
*
req
.
Endpoint
}
if
req
.
Username
!=
nil
{
target
.
Username
=
*
req
.
Username
}
if
req
.
Password
!=
nil
{
target
.
Password
=
*
req
.
Password
}
if
req
.
Insecure
!=
nil
{
target
.
Insecure
=
*
req
.
Insecure
}
if
len
(
target
.
URL
)
==
0
{
t
.
HandleBadRequest
(
"empty endpoint"
)
return
}
t
.
ping
(
req
.
Endpoint
,
req
.
Username
,
req
.
Password
,
req
.
Insecure
)
t
.
ping
(
target
.
URL
,
target
.
Username
,
target
.
Password
,
target
.
Insecure
)
}
// Get ...
...
...
This diff is collapsed.
Click to expand it.
src/ui/api/target_test.go
+
32
-
56
View file @
7ccdce33
...
...
@@ -15,11 +15,13 @@ package api
import
(
"fmt"
"net/http"
"os"
"strconv"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/vmware/harbor/tests/apitests/apilib"
)
...
...
@@ -110,72 +112,46 @@ func TestTargetsGet(t *testing.T) {
}
func
TestTargetPing
(
t
*
testing
.
T
)
{
var
httpStatusCode
int
var
err
error
assert
:=
assert
.
New
(
t
)
apiTest
:=
newHarborAPI
()
fmt
.
Println
(
"Testing Targets Ping Post API"
)
//case 1
body
:=
struct
{
// 404: not exist target
target01
:=
struct
{
ID
int64
`json:"id"`
}{
ID
:
10000
,
}
code
,
err
:=
apiTest
.
PingTarget
(
*
admin
,
target01
)
require
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
http
.
StatusNotFound
,
code
)
// 400: empty endpoint
target02
:=
struct
{
Endpoint
string
`json:"endpoint"`
}{
Endpoint
:
""
,
}
code
,
err
=
apiTest
.
PingTarget
(
*
admin
,
target02
)
require
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
http
.
StatusBadRequest
,
code
)
// 200
target03
:=
struct
{
ID
int64
`json:"id"`
Endpoint
string
`json:"endpoint"`
Username
string
`json:"username"`
Password
string
`json:"password"`
Insecure
bool
`json:"insecure"`
}{
ID
:
int64
(
addTargetID
),
Endpoint
:
os
.
Getenv
(
"REGISTRY_URL"
),
Username
:
adminName
,
Password
:
adminPwd
,
Insecure
:
true
,
}
httpStatusCode
,
err
=
apiTest
.
PingTarget
(
*
admin
,
body
)
if
err
!=
nil
{
t
.
Error
(
"Error while ping target"
,
err
.
Error
())
t
.
Log
(
err
)
}
else
{
assert
.
Equal
(
int
(
200
),
httpStatusCode
,
""
)
}
//case 2
body
.
Endpoint
=
""
httpStatusCode
,
err
=
apiTest
.
PingTarget
(
*
admin
,
body
)
if
err
!=
nil
{
t
.
Error
(
"Error while ping target"
,
err
.
Error
())
}
else
{
assert
.
Equal
(
int
(
400
),
httpStatusCode
,
""
)
}
}
func
TestTargetPingByID
(
t
*
testing
.
T
)
{
var
httpStatusCode
int
var
err
error
assert
:=
assert
.
New
(
t
)
apiTest
:=
newHarborAPI
()
fmt
.
Println
(
"Testing Targets Ping Post API"
)
//-------------------case 1 : response code = 200------------------------//
fmt
.
Println
(
"case 1 : response code = 200"
)
id
:=
addTargetID
httpStatusCode
,
err
=
apiTest
.
PingTargetByID
(
*
admin
,
id
)
if
err
!=
nil
{
t
.
Error
(
"Error whihle ping target"
,
err
.
Error
())
t
.
Log
(
err
)
}
else
{
assert
.
Equal
(
int
(
200
),
httpStatusCode
,
"httpStatusCode should be 200"
)
}
//--------------case 2 : response code = 404,target not found------------//
fmt
.
Println
(
"case 2 : response code = 404,target not found"
)
id
=
1111
httpStatusCode
,
err
=
apiTest
.
PingTargetByID
(
*
admin
,
id
)
if
err
!=
nil
{
t
.
Error
(
"Error whihle ping target"
,
err
.
Error
())
t
.
Log
(
err
)
}
else
{
assert
.
Equal
(
int
(
404
),
httpStatusCode
,
"httpStatusCode should be 404"
)
}
code
,
err
=
apiTest
.
PingTarget
(
*
admin
,
target03
)
require
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
http
.
StatusOK
,
code
)
}
func
TestTargetGetByID
(
t
*
testing
.
T
)
{
...
...
This diff is collapsed.
Click to expand it.
src/ui/router.go
+
0
-
1
View file @
7ccdce33
...
...
@@ -114,7 +114,6 @@ func initRouters() {
beego
.
Router
(
"/api/targets/:id([0-9]+)"
,
&
api
.
TargetAPI
{})
beego
.
Router
(
"/api/targets/:id([0-9]+)/policies/"
,
&
api
.
TargetAPI
{},
"get:ListPolicies"
)
beego
.
Router
(
"/api/targets/ping"
,
&
api
.
TargetAPI
{},
"post:Ping"
)
beego
.
Router
(
"/api/targets/:id([0-9]+)/ping"
,
&
api
.
TargetAPI
{},
"post:PingByID"
)
beego
.
Router
(
"/api/logs"
,
&
api
.
LogAPI
{})
beego
.
Router
(
"/api/configurations"
,
&
api
.
ConfigAPI
{})
beego
.
Router
(
"/api/configurations/reset"
,
&
api
.
ConfigAPI
{},
"post:Reset"
)
...
...
This diff is collapsed.
Click to expand it.
src/ui_ng/lib/src/create-edit-endpoint/create-edit-endpoint.component.html.ts
+
7
-
7
View file @
7ccdce33
...
...
@@ -15,7 +15,7 @@ export const CREATE_EDIT_ENDPOINT_TEMPLATE: string = `
<div class="form-group">
<label for="destination_name" class="col-md-4 form-group-label-override required">{{ 'DESTINATION.NAME' | translate }}</label>
<label class="col-md-8" for="destination_name" aria-haspopup="true" role="tooltip" [class.invalid]="targetName.errors && (targetName.dirty || targetName.touched)" [class.valid]="targetName.valid" class="tooltip tooltip-validation tooltip-sm tooltip-bottom-left">
<input type="text" id="destination_name" [disabled]="testOngoing" [readonly]="!editable" [(ngModel)]="target.name" name="targetName" size="20" #targetName="ngModel" required
(keyup)="changedTargetName($event)"
>
<input type="text" id="destination_name" [disabled]="testOngoing" [readonly]="!editable" [(ngModel)]="target.name" name="targetName" size="20" #targetName="ngModel" required>
<span class="tooltip-content" *ngIf="targetName.errors && targetName.errors.required && (targetName.dirty || targetName.touched)">
{{ 'DESTINATION.NAME_IS_REQUIRED' | translate }}
</span>
...
...
@@ -24,7 +24,7 @@ export const CREATE_EDIT_ENDPOINT_TEMPLATE: string = `
<div class="form-group">
<label for="destination_url" class="col-md-4 form-group-label-override required">{{ 'DESTINATION.URL' | translate }}</label>
<label class="col-md-8" for="destination_url" aria-haspopup="true" role="tooltip" [class.invalid]="targetEndpoint.errors && (targetEndpoint.dirty || targetEndpoint.touched)" [class.valid]="targetEndpoint.valid" class="tooltip tooltip-validation tooltip-sm tooltip-bottom-left">
<input type="text" id="destination_url" [disabled]="testOngoing" [readonly]="!editable" [(ngModel)]="target.endpoint" size="20" name="endpointUrl" #targetEndpoint="ngModel" required
(keyup)="clearPassword($event)"
placeholder="http(s)://192.168.1.1">
<input type="text" id="destination_url" [disabled]="testOngoing" [readonly]="!editable" [(ngModel)]="target.endpoint" size="20" name="endpointUrl" #targetEndpoint="ngModel" required placeholder="http(s)://192.168.1.1">
<span class="tooltip-content" *ngIf="targetEndpoint.errors && targetEndpoint.errors.required && (targetEndpoint.dirty || targetEndpoint.touched)">
{{ 'DESTINATION.URL_IS_REQUIRED' | translate }}
</span>
...
...
@@ -32,15 +32,15 @@ export const CREATE_EDIT_ENDPOINT_TEMPLATE: string = `
</div>
<div class="form-group">
<label for="destination_username" class="col-md-4 form-group-label-override">{{ 'DESTINATION.USERNAME' | translate }}</label>
<input type="text" class="col-md-8" id="destination_username" [disabled]="testOngoing" [readonly]="!editable" [(ngModel)]="target.username" size="20" name="username" #username="ngModel"
(keyup)="clearPassword($event)"
>
<input type="text" class="col-md-8" id="destination_username" [disabled]="testOngoing" [readonly]="!editable" [(ngModel)]="target.username" size="20" name="username" #username="ngModel">
</div>
<div class="form-group">
<label for="destination_password" class="col-md-4 form-group-label-override">{{ 'DESTINATION.PASSWORD' | translate }}</label>
<input type="password" class="col-md-8" id="destination_password" [disabled]="testOngoing" [readonly]="!editable" [(ngModel)]="target.password" size="20" name="password" #password="ngModel"
(focus)="clearPassword($event)"
>
<input type="password" class="col-md-8" id="destination_password" [disabled]="testOngoing" [readonly]="!editable" [(ngModel)]="target.password" size="20" name="password" #password="ngModel">
</div>
<div class="form-group">
<label for="destination_insecure" class="col-md-4 form-group-label-override">{{'CONFIG.VERIFY_REMOTE_CERT' | translate }}</label>
<clr-checkbox #insecure class="col-md-8" name="insecure" id="destination_insecure" [clrDisabled]="testOngoing" [clrChecked]="!target.insecure" (clrCheckedChange)="setInsecureValue($event)">
<clr-checkbox #insecure class="col-md-8" name="insecure" id="destination_insecure" [clrDisabled]="testOngoing
|| !editable
" [clrChecked]="!target.insecure" (clrCheckedChange)="setInsecureValue($event)">
<a href="javascript:void(0)" role="tooltip" aria-haspopup="true" class="tooltip tooltip-top-right" style="top:-7px;">
<clr-icon shape="info-circle" class="info-tips-icon" size="24"></clr-icon>
<span class="tooltip-content">{{'CONFIG.TOOLTIP.VERIFY_REMOTE_CERT' | translate}}</span>
...
...
@@ -55,8 +55,8 @@ export const CREATE_EDIT_ENDPOINT_TEMPLATE: string = `
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline" (click)="testConnection()" [disabled]="
testOngoing || onGoing
|| targetEndpoint.errors">{{ 'DESTINATION.TEST_CONNECTION' | translate }}</button>
<button type="button" class="btn btn-outline" (click)="onCancel()" [disabled]="
testOngoing || onGoing
">{{ 'BUTTON.CANCEL' | translate }}</button>
<button type="button" class="btn btn-outline" (click)="testConnection()" [disabled]="
inProgress
|| targetEndpoint.errors">{{ 'DESTINATION.TEST_CONNECTION' | translate }}</button>
<button type="button" class="btn btn-outline" (click)="onCancel()" [disabled]="
inProgress
">{{ 'BUTTON.CANCEL' | translate }}</button>
<button type="submit" class="btn btn-primary" (click)="onSubmit()" [disabled]="!isValid">{{ 'BUTTON.OK' | translate }}</button>
</div>
</clr-modal>`
;
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/ui_ng/lib/src/create-edit-endpoint/create-edit-endpoint.component.ts
+
61
-
75
View file @
7ccdce33
...
...
@@ -35,7 +35,7 @@ import { TranslateService } from '@ngx-translate/core';
import
{
CREATE_EDIT_ENDPOINT_STYLE
}
from
'
./create-edit-endpoint.component.css
'
;
import
{
CREATE_EDIT_ENDPOINT_TEMPLATE
}
from
'
./create-edit-endpoint.component.html
'
;
import
{
toPromise
,
clone
,
compareValue
}
from
'
../utils
'
;
import
{
toPromise
,
clone
,
compareValue
,
isEmptyObject
}
from
'
../utils
'
;
import
{
Subscription
}
from
'
rxjs/Subscription
'
;
...
...
@@ -51,8 +51,6 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
createEditDestinationOpened
:
boolean
;
staticBackdrop
:
boolean
=
true
;
closable
:
boolean
=
false
;
actionType
:
ActionType
;
editable
:
boolean
;
target
:
Endpoint
=
this
.
initEndpoint
();
...
...
@@ -62,11 +60,9 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
@
ViewChild
(
'
targetForm
'
)
currentForm
:
NgForm
;
endpointHasChanged
:
boolean
;
targetNameHasChanged
:
boolean
;
testOngoing
:
boolean
;
onGoing
:
boolean
;
endpointId
:
number
|
string
;
@
ViewChild
(
InlineAlertComponent
)
inlineAlert
:
InlineAlertComponent
;
...
...
@@ -84,41 +80,21 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
private
ref
:
ChangeDetectorRef
)
{
}
public
get
hasChanged
():
boolean
{
if
(
this
.
actionType
===
ActionType
.
ADD_NEW
)
{
//Create new
return
this
.
target
&&
(
(
this
.
target
.
endpoint
&&
this
.
target
.
endpoint
.
trim
()
!==
""
)
||
(
this
.
target
.
name
&&
this
.
target
.
name
.
trim
()
!==
""
)
||
(
this
.
target
.
username
&&
this
.
target
.
username
.
trim
()
!==
""
)
||
(
this
.
target
.
password
&&
this
.
target
.
password
.
trim
()
!==
""
))
||
this
.
target
.
insecure
;
}
else
{
//Edit
return
!
compareValue
(
this
.
target
,
this
.
initVal
);
}
}
public
get
isValid
():
boolean
{
return
!
this
.
testOngoing
&&
!
this
.
onGoing
&&
this
.
targetForm
&&
this
.
targetForm
.
valid
&&
this
.
editable
&&
(
this
.
targetNameHasChanged
||
this
.
endpointHasChanged
||
this
.
checkboxHasChanged
);
!
compareValue
(
this
.
target
,
this
.
initVal
);
}
public
get
inProgress
():
boolean
{
return
this
.
onGoing
||
this
.
testOngoing
;
}
public
get
checkboxHasChanged
():
boolean
{
return
(
this
.
target
.
insecure
!==
this
.
initVal
.
insecure
)
?
true
:
false
;
}
setInsecureValue
(
$event
:
any
)
{
this
.
target
.
insecure
=
!
$event
;
this
.
endpointHasChanged
=
true
;
}
ngOnDestroy
():
void
{
...
...
@@ -148,8 +124,6 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
reset
():
void
{
//Reset status variables
this
.
endpointHasChanged
=
false
;
this
.
targetNameHasChanged
=
false
;
this
.
testOngoing
=
false
;
this
.
onGoing
=
false
;
...
...
@@ -157,6 +131,9 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
this
.
target
=
this
.
initEndpoint
();
this
.
initVal
=
this
.
initEndpoint
();
this
.
formValues
=
null
;
this
.
endpointId
=
''
;
this
.
inlineAlert
.
close
();
}
//Forcely refresh the view
...
...
@@ -179,7 +156,7 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
//reset
this
.
reset
();
if
(
targetId
)
{
this
.
actionType
=
ActionType
.
EDIT
;
this
.
endpointId
=
targetId
;
this
.
translateService
.
get
(
'
DESTINATION.TITLE_EDIT
'
).
subscribe
(
res
=>
this
.
modalTitle
=
res
);
toPromise
<
Endpoint
>
(
this
.
endpointService
.
getEndpoint
(
targetId
))
...
...
@@ -197,7 +174,7 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
})
.
catch
(
error
=>
this
.
errorHandler
.
error
(
error
));
}
else
{
this
.
actionType
=
ActionType
.
ADD_NEW
;
this
.
endpointId
=
''
;
this
.
translateService
.
get
(
'
DESTINATION.TITLE_ADD
'
).
subscribe
(
res
=>
this
.
modalTitle
=
res
);
//Directly open the modal
this
.
open
();
...
...
@@ -206,14 +183,23 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
testConnection
()
{
let
payload
:
Endpoint
=
this
.
initEndpoint
();
if
(
this
.
endpointHasChanged
)
{
if
(
!
this
.
endpointId
)
{
payload
.
endpoint
=
this
.
target
.
endpoint
;
payload
.
username
=
this
.
target
.
username
;
payload
.
password
=
this
.
target
.
password
;
payload
.
insecure
=
this
.
target
.
insecure
;
}
else
{
}
else
{
let
changes
:
{[
key
:
string
]:
any
}
=
this
.
getChanges
();
for
(
let
prop
in
payload
)
{
delete
payload
[
prop
];
}
payload
.
id
=
this
.
target
.
id
;
if
(
!
isEmptyObject
(
changes
))
{
let
changekeys
:
{[
key
:
string
]:
any
}
=
Object
.
keys
(
this
.
getChanges
());
changekeys
.
forEach
((
key
:
string
)
=>
{
payload
[
key
]
=
changes
[
key
];
});
}
}
this
.
testOngoing
=
true
;
...
...
@@ -232,27 +218,11 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
});
}
changedTargetName
(
$event
:
any
)
{
if
(
this
.
editable
)
{
this
.
targetNameHasChanged
=
true
;
}
}
clearPassword
(
$event
:
any
)
{
if
(
this
.
editable
)
{
this
.
target
.
password
=
''
;
this
.
endpointHasChanged
=
true
;
}
}
onSubmit
()
{
switch
(
this
.
actionType
)
{
case
ActionType
.
ADD_NEW
:
this
.
addEndpoint
();
break
;
case
ActionType
.
EDIT
:
this
.
updateEndpoint
();
break
;
if
(
this
.
endpointId
)
{
this
.
updateEndpoint
();
}
else
{
this
.
addEndpoint
();
}
}
...
...
@@ -286,27 +256,19 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
if
(
this
.
onGoing
)
{
return
;
//Avoid duplicated submitting
}
if
(
!
(
this
.
targetNameHasChanged
||
this
.
endpointHasChanged
||
this
.
checkboxHasChanged
))
{
return
;
//Avoid invalid submitting
}
let
payload
:
Endpoint
=
this
.
initEndpoint
();
if
(
this
.
targetNameHasChanged
)
{
payload
.
name
=
this
.
target
.
name
;
}
else
{
delete
payload
.
name
;
for
(
let
prop
in
payload
)
{
delete
payload
[
prop
];
}
if
(
this
.
endpointHasChanged
)
{
payload
.
endpoint
=
this
.
target
.
endpoint
;
payload
.
username
=
this
.
target
.
username
;
payload
.
password
=
this
.
target
.
password
;
}
else
{
delete
payload
.
endpoint
;
}
if
(
this
.
checkboxHasChanged
)
{
payload
.
insecure
=
this
.
target
.
insecure
;
}
else
{
delete
payload
.
insecure
;
let
changes
:
{[
key
:
string
]:
any
}
=
this
.
getChanges
();
let
changekeys
:
{[
key
:
string
]:
any
}
=
Object
.
keys
(
this
.
getChanges
());
if
(
isEmptyObject
(
changes
))
{
return
;
}
changekeys
.
forEach
((
key
:
string
)
=>
{
payload
[
key
]
=
changes
[
key
];
});
if
(
!
this
.
target
.
id
)
{
return
;
}
...
...
@@ -346,9 +308,10 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
}
onCancel
()
{
if
(
this
.
hasChanged
)
{
let
changes
:
{[
key
:
string
]:
any
}
=
this
.
getChanges
();
if
(
!
isEmptyObject
(
changes
))
{
this
.
inlineAlert
.
showInlineConfirmation
({
message
:
'
ALERT.FORM_CHANGE_CONFIRMATION
'
});
}
else
{
}
else
{
this
.
close
();
if
(
this
.
targetForm
)
{
this
.
targetForm
.
reset
();
...
...
@@ -388,5 +351,28 @@ export class CreateEditEndpointComponent implements AfterViewChecked, OnDestroy
}
}
}
getChanges
():
{
[
key
:
string
]:
any
|
any
[]
}
{
let
changes
:
{
[
key
:
string
]:
any
|
any
[]
}
=
{};
if
(
!
this
.
target
||
!
this
.
initVal
)
{
return
changes
;
}
for
(
let
prop
in
this
.
target
)
{
let
field
:
any
=
this
.
initVal
[
prop
];
if
(
!
compareValue
(
field
,
this
.
target
[
prop
]))
{
changes
[
prop
]
=
this
.
target
[
prop
];
//Number
if
(
typeof
field
===
"
number
"
)
{
changes
[
prop
]
=
+
changes
[
prop
];
}
//Trim string value
if
(
typeof
field
===
"
string
"
)
{
changes
[
prop
]
=
(
''
+
changes
[
prop
]).
trim
();
}
}
}
return
changes
;
}
}
\ No newline at end of file
}
This diff is collapsed.
Click to expand it.
src/ui_ng/lib/src/service/endpoint.service.ts
+
1
-
11
View file @
7ccdce33
...
...
@@ -185,22 +185,12 @@ export class EndpointDefaultService extends EndpointService {
if
(
!
endpoint
)
{
return
Promise
.
reject
(
'
Invalid endpoint.
'
);
}
let
requestUrl
:
string
;
if
(
endpoint
.
id
)
{
requestUrl
=
`
${
this
.
_endpointUrl
}
/
${
endpoint
.
id
}
/ping`
;
return
this
.
http
.
post
(
requestUrl
,
HTTP_JSON_OPTIONS
)
.
toPromise
()
.
then
(
response
=>
response
.
status
)
.
catch
(
error
=>
Promise
.
reject
(
error
));
}
else
{
requestUrl
=
`
${
this
.
_endpointUrl
}
/ping`
;
let
requestUrl
:
string
=
`
${
this
.
_endpointUrl
}
/ping`
;
return
this
.
http
.
post
(
requestUrl
,
endpoint
,
HTTP_JSON_OPTIONS
)
.
toPromise
()
.
then
(
response
=>
response
.
status
)
.
catch
(
error
=>
Promise
.
reject
(
error
));
}
}
public
getEndpointWithReplicationRules
(
endpointId
:
number
|
string
):
Observable
<
any
>
|
Promise
<
any
>
|
any
{
...
...
This diff is collapsed.
Click to expand it.
src/ui_ng/lib/src/service/interface.ts
+
1
-
0
View file @
7ccdce33
...
...
@@ -75,6 +75,7 @@ export interface Endpoint extends Base {
password
?:
string
;
insecure
:
boolean
;
type
:
number
;
[
key
:
string
]:
any
;
}
/**
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help