Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
apollo
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
openSource
apollo
Commits
f60ee3e2
Commit
f60ee3e2
authored
May 09, 2016
by
Yiming Liu
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #179 from lepdou/namespace
创建appnamespace
parents
633eb438
1ea8697c
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
244 additions
and
63 deletions
+244
-63
AppController.java
...m/ctrip/apollo/adminservice/controller/AppController.java
+1
-0
AppNamespaceController.java
...pollo/adminservice/controller/AppNamespaceController.java
+25
-0
AppNamespaceControllerTest.java
...o/adminservice/controller/AppNamespaceControllerTest.java
+45
-0
AppNamespaceService.java
...ava/com/ctrip/apollo/biz/service/AppNamespaceService.java
+31
-0
AppNamespaceDTO.java
.../main/java/com/ctrip/apollo/core/dto/AppNamespaceDTO.java
+9
-0
AdminServiceAPI.java
...ain/java/com/ctrip/apollo/portal/api/AdminServiceAPI.java
+8
-2
AppController.java
...ava/com/ctrip/apollo/portal/controller/AppController.java
+2
-2
ConfigController.java
.../com/ctrip/apollo/portal/controller/ConfigController.java
+0
-1
NamespaceController.java
...m/ctrip/apollo/portal/controller/NamespaceController.java
+10
-2
AppService.java
...main/java/com/ctrip/apollo/portal/service/AppService.java
+4
-5
NamespaceService.java
...ava/com/ctrip/apollo/portal/service/NamespaceService.java
+14
-2
config.html
apollo-portal/src/main/resources/static/config.html
+2
-2
sync.html
apollo-portal/src/main/resources/static/config/sync.html
+1
-1
namespace.html
apollo-portal/src/main/resources/static/namespace.html
+29
-22
AppUtils.js
apollo-portal/src/main/resources/static/scripts/AppUtils.js
+0
-7
NamespaceController.js
...esources/static/scripts/controller/NamespaceController.js
+38
-8
AppConfigController.js
...rces/static/scripts/controller/app/AppConfigController.js
+2
-2
NamespaceService.js
...ain/resources/static/scripts/services/NamespaceService.js
+19
-3
common-style.css
...-portal/src/main/resources/static/styles/common-style.css
+0
-1
select2.min.css
.../src/main/resources/static/vendor/select2/select2.min.css
+0
-0
select2.min.js
...l/src/main/resources/static/vendor/select2/select2.min.js
+0
-0
footer.html
...portal/src/main/resources/static/views/common/footer.html
+1
-0
AppServiceTest.java
...src/test/java/com/ctrip/apollo/portal/AppServiceTest.java
+2
-2
ServiceExceptionTest.java
...st/java/com/ctrip/apollo/portal/ServiceExceptionTest.java
+1
-1
No files found.
apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppController.java
View file @
f60ee3e2
...
...
@@ -40,6 +40,7 @@ public class AppController {
entity
=
appService
.
update
(
managedEntity
);
}
else
{
entity
.
setDataChangeCreatedBy
(
user
.
getUsername
());
entity
.
setDataChangeLastModifiedBy
(
user
.
getUsername
());
entity
=
adminService
.
createNewApp
(
entity
);
}
...
...
apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppNamespaceController.java
View file @
f60ee3e2
...
...
@@ -2,12 +2,16 @@ package com.ctrip.apollo.adminservice.controller;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.security.core.userdetails.UserDetails
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.ctrip.apollo.biz.entity.AppNamespace
;
import
com.ctrip.apollo.biz.service.AppNamespaceService
;
import
com.ctrip.apollo.common.auth.ActiveUser
;
import
com.ctrip.apollo.common.utils.BeanUtils
;
import
com.ctrip.apollo.core.dto.AppNamespaceDTO
;
...
...
@@ -31,4 +35,25 @@ public class AppNamespaceController {
return
BeanUtils
.
batchTransform
(
AppNamespaceDTO
.
class
,
appNamespaces
);
}
@RequestMapping
(
value
=
"/apps/{appId}/appnamespaces"
,
method
=
RequestMethod
.
POST
)
public
AppNamespaceDTO
createOrUpdate
(
@RequestBody
AppNamespaceDTO
appNamespace
,
@ActiveUser
UserDetails
user
){
AppNamespace
entity
=
BeanUtils
.
transfrom
(
AppNamespace
.
class
,
appNamespace
);
AppNamespace
managedEntity
=
appNamespaceService
.
findOne
(
entity
.
getAppId
(),
entity
.
getName
());
String
userName
=
user
.
getUsername
();
if
(
managedEntity
!=
null
){
managedEntity
.
setDataChangeLastModifiedBy
(
userName
);
BeanUtils
.
copyEntityProperties
(
entity
,
managedEntity
);
entity
=
appNamespaceService
.
update
(
managedEntity
);
}
else
{
entity
.
setDataChangeLastModifiedBy
(
userName
);
entity
.
setDataChangeCreatedBy
(
userName
);
entity
=
appNamespaceService
.
createAppNamespace
(
entity
,
userName
);
}
return
BeanUtils
.
transfrom
(
AppNamespaceDTO
.
class
,
entity
);
}
}
apollo-adminservice/src/test/java/com/ctrip/apollo/adminservice/controller/AppNamespaceControllerTest.java
0 → 100644
View file @
f60ee3e2
package
com
.
ctrip
.
apollo
.
adminservice
.
controller
;
import
com.ctrip.apollo.biz.entity.AppNamespace
;
import
com.ctrip.apollo.biz.repository.AppNamespaceRepository
;
import
com.ctrip.apollo.core.dto.AppNamespaceDTO
;
import
org.junit.Assert
;
import
org.junit.Test
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.test.context.jdbc.Sql
;
public
class
AppNamespaceControllerTest
extends
AbstractControllerTest
{
@Autowired
private
AppNamespaceRepository
namespaceRepository
;
@Test
@Sql
(
scripts
=
"/controller/cleanup.sql"
,
executionPhase
=
Sql
.
ExecutionPhase
.
AFTER_TEST_METHOD
)
public
void
testCreate
(){
String
appId
=
"6666"
;
String
name
=
"testnamespace"
;
String
comment
=
"comment"
;
AppNamespaceDTO
dto
=
new
AppNamespaceDTO
();
dto
.
setAppId
(
appId
);
dto
.
setName
(
name
);
dto
.
setComment
(
comment
);
AppNamespaceDTO
resultDto
=
restTemplate
.
postForEntity
(
String
.
format
(
"http://localhost:%d/apps/%s/appnamespaces"
,
port
,
appId
),
dto
,
AppNamespaceDTO
.
class
).
getBody
();
Assert
.
assertEquals
(
appId
,
resultDto
.
getAppId
());
Assert
.
assertTrue
(
resultDto
.
getId
()
>
0
);
AppNamespace
savedAppNs
=
namespaceRepository
.
findByAppIdAndName
(
appId
,
name
);
Assert
.
assertNotNull
(
savedAppNs
);
Assert
.
assertNotNull
(
savedAppNs
.
getDataChangeCreatedTime
());
Assert
.
assertNotNull
(
savedAppNs
.
getDataChangeLastModifiedTime
());
Assert
.
assertNotNull
(
savedAppNs
.
getDataChangeLastModifiedBy
());
Assert
.
assertNotNull
(
savedAppNs
.
getDataChangeCreatedBy
());
}
}
apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AppNamespaceService.java
View file @
f60ee3e2
...
...
@@ -14,8 +14,10 @@ import org.springframework.transaction.annotation.Transactional;
import
com.ctrip.apollo.biz.entity.AppNamespace
;
import
com.ctrip.apollo.biz.entity.Audit
;
import
com.ctrip.apollo.biz.repository.AppNamespaceRepository
;
import
com.ctrip.apollo.common.utils.BeanUtils
;
import
com.ctrip.apollo.core.ConfigConsts
;
import
com.ctrip.apollo.core.exception.ServiceException
;
import
com.ctrip.apollo.core.utils.StringUtils
;
@Service
public
class
AppNamespaceService
{
...
...
@@ -37,6 +39,11 @@ public class AppNamespaceService {
return
appNamespaceRepository
.
findByName
(
namespaceName
);
}
public
AppNamespace
findOne
(
String
appId
,
String
namespaceName
){
Preconditions
.
checkArgument
(!
StringUtils
.
isContainEmpty
(
appId
,
namespaceName
),
"appId or Namespace must not be null"
);
return
appNamespaceRepository
.
findByAppIdAndName
(
appId
,
namespaceName
);
}
@Transactional
public
void
createDefaultAppNamespace
(
String
appId
,
String
createBy
)
{
if
(!
isAppNamespaceNameUnique
(
appId
,
appId
))
{
...
...
@@ -54,7 +61,31 @@ public class AppNamespaceService {
createBy
);
}
@Transactional
public
AppNamespace
createAppNamespace
(
AppNamespace
appNamespace
,
String
createBy
){
if
(!
isAppNamespaceNameUnique
(
appNamespace
.
getAppId
(),
appNamespace
.
getName
()))
{
throw
new
ServiceException
(
"appnamespace not unique"
);
}
appNamespace
.
setDataChangeCreatedBy
(
createBy
);
appNamespace
.
setDataChangeLastModifiedBy
(
createBy
);
appNamespace
=
appNamespaceRepository
.
save
(
appNamespace
);
auditService
.
audit
(
AppNamespace
.
class
.
getSimpleName
(),
appNamespace
.
getId
(),
Audit
.
OP
.
INSERT
,
createBy
);
return
appNamespace
;
}
public
List
<
AppNamespace
>
findPublicAppNamespaces
(){
return
appNamespaceRepository
.
findByNameNot
(
ConfigConsts
.
NAMESPACE_DEFAULT
);
}
public
AppNamespace
update
(
AppNamespace
appNamespace
){
AppNamespace
managedNs
=
appNamespaceRepository
.
findByAppIdAndName
(
appNamespace
.
getAppId
(),
appNamespace
.
getName
());
BeanUtils
.
copyEntityProperties
(
appNamespace
,
managedNs
);
managedNs
=
appNamespaceRepository
.
save
(
managedNs
);
auditService
.
audit
(
AppNamespace
.
class
.
getSimpleName
(),
managedNs
.
getId
(),
Audit
.
OP
.
UPDATE
,
managedNs
.
getDataChangeLastModifiedBy
());
return
managedNs
;
}
}
apollo-core/src/main/java/com/ctrip/apollo/core/dto/AppNamespaceDTO.java
View file @
f60ee3e2
package
com
.
ctrip
.
apollo
.
core
.
dto
;
public
class
AppNamespaceDTO
{
private
long
id
;
private
String
name
;
...
...
@@ -8,6 +9,14 @@ public class AppNamespaceDTO {
private
String
comment
;
public
long
getId
()
{
return
id
;
}
public
void
setId
(
long
id
)
{
this
.
id
=
id
;
}
public
String
getName
()
{
return
name
;
}
...
...
apollo-portal/src/main/java/com/ctrip/apollo/portal/api/AdminServiceAPI.java
View file @
f60ee3e2
...
...
@@ -38,7 +38,7 @@ public class AdminServiceAPI {
return
restTemplate
.
getForObject
(
getAdminServiceHost
(
env
)
+
APP_API
+
"/"
+
appId
,
AppDTO
.
class
);
}
public
AppDTO
save
(
Env
env
,
AppDTO
app
)
{
public
AppDTO
createApp
(
Env
env
,
AppDTO
app
)
{
return
restTemplate
.
postForEntity
(
getAdminServiceHost
(
env
)
+
APP_API
,
app
,
AppDTO
.
class
)
.
getBody
();
}
...
...
@@ -70,13 +70,19 @@ public class AdminServiceAPI {
return
Arrays
.
asList
(
appNamespaceDTOs
);
}
public
NamespaceDTO
sav
e
(
Env
env
,
NamespaceDTO
namespace
)
{
public
NamespaceDTO
createNamespac
e
(
Env
env
,
NamespaceDTO
namespace
)
{
return
restTemplate
.
postForEntity
(
getAdminServiceHost
(
env
)
+
String
.
format
(
"/apps/%s/clusters/%s/namespaces"
,
namespace
.
getAppId
(),
namespace
.
getClusterName
()),
namespace
,
NamespaceDTO
.
class
)
.
getBody
();
}
public
AppNamespaceDTO
createAppNamespace
(
Env
env
,
AppNamespaceDTO
appNamespace
)
{
return
restTemplate
.
postForEntity
(
getAdminServiceHost
(
env
)
+
String
.
format
(
"/apps/%s/appnamespaces"
,
appNamespace
.
getAppId
()),
appNamespace
,
AppNamespaceDTO
.
class
)
.
getBody
();
}
}
@Service
...
...
apollo-portal/src/main/java/com/ctrip/apollo/portal/controller/AppController.java
View file @
f60ee3e2
...
...
@@ -49,9 +49,9 @@ public class AppController {
throw
new
BadRequestException
(
"request payload contains empty"
);
}
if
(
"ALL"
.
equals
(
env
)){
appService
.
save
(
app
);
appService
.
createAppInAllEnvs
(
app
);
}
else
{
appService
.
save
(
Env
.
valueOf
(
env
),
app
);
appService
.
createApp
(
Env
.
valueOf
(
env
),
app
);
}
return
ResponseEntity
.
ok
().
build
();
}
...
...
apollo-portal/src/main/java/com/ctrip/apollo/portal/controller/ConfigController.java
View file @
f60ee3e2
...
...
@@ -9,7 +9,6 @@ import com.ctrip.apollo.core.utils.StringUtils;
import
com.ctrip.apollo.portal.entity.ItemDiffs
;
import
com.ctrip.apollo.portal.entity.form.NamespaceSyncModel
;
import
com.ctrip.apollo.portal.entity.form.NamespaceTextModel
;
import
com.ctrip.apollo.portal.entity.NamespaceVO
;
import
com.ctrip.apollo.portal.entity.form.NamespaceReleaseModel
;
import
com.ctrip.apollo.portal.service.ConfigService
;
...
...
apollo-portal/src/main/java/com/ctrip/apollo/portal/controller/NamespaceController.java
View file @
f60ee3e2
...
...
@@ -29,12 +29,20 @@ public class NamespaceController {
}
@RequestMapping
(
value
=
"/apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces"
,
method
=
RequestMethod
.
POST
)
public
NamespaceDTO
sav
e
(
@PathVariable
String
env
,
@RequestBody
NamespaceDTO
namespace
){
public
NamespaceDTO
createNamespac
e
(
@PathVariable
String
env
,
@RequestBody
NamespaceDTO
namespace
){
if
(
StringUtils
.
isContainEmpty
(
env
,
namespace
.
getAppId
(),
namespace
.
getClusterName
(),
namespace
.
getNamespaceName
())){
throw
new
BadRequestException
(
"request payload contains empty"
);
}
return
namespaceService
.
save
(
Env
.
valueOf
(
env
),
namespace
);
return
namespaceService
.
createNamespace
(
Env
.
valueOf
(
env
),
namespace
);
}
@RequestMapping
(
value
=
"/apps/{appId}/appnamespaces"
,
method
=
RequestMethod
.
POST
)
public
void
createAppNamespace
(
@PathVariable
String
appId
,
@RequestBody
AppNamespaceDTO
appNamespace
){
if
(
StringUtils
.
isContainEmpty
(
appId
,
appNamespace
.
getAppId
(),
appNamespace
.
getName
())){
throw
new
BadRequestException
(
"request payload contains empty"
);
}
namespaceService
.
createAppNamespace
(
appNamespace
);
}
@RequestMapping
(
"/apps/{appId}/env/{env}/clusters/{clusterName}/namespaces"
)
...
...
apollo-portal/src/main/java/com/ctrip/apollo/portal/service/AppService.java
View file @
f60ee3e2
package
com
.
ctrip
.
apollo
.
portal
.
service
;
import
java.util.Arrays
;
import
java.util.LinkedList
;
import
java.util.List
;
...
...
@@ -84,11 +83,11 @@ public class AppService {
return
tree
;
}
public
void
save
(
AppDTO
app
)
{
public
void
createAppInAllEnvs
(
AppDTO
app
)
{
List
<
Env
>
envs
=
portalSettings
.
getEnvs
();
for
(
Env
env
:
envs
)
{
try
{
appAPI
.
save
(
env
,
app
);
appAPI
.
createApp
(
env
,
app
);
}
catch
(
HttpStatusCodeException
e
)
{
logger
.
error
(
ExceptionUtils
.
toString
(
e
));
throw
e
;
...
...
@@ -96,9 +95,9 @@ public class AppService {
}
}
public
void
save
(
Env
env
,
AppDTO
app
)
{
public
void
createApp
(
Env
env
,
AppDTO
app
)
{
try
{
appAPI
.
save
(
env
,
app
);
appAPI
.
createApp
(
env
,
app
);
}
catch
(
HttpStatusCodeException
e
)
{
logger
.
error
(
ExceptionUtils
.
toString
(
e
));
throw
e
;
...
...
apollo-portal/src/main/java/com/ctrip/apollo/portal/service/NamespaceService.java
View file @
f60ee3e2
...
...
@@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.http.HttpStatus
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.client.HttpClientErrorException
;
import
org.springframework.web.client.HttpStatusCodeException
;
import
java.util.Collections
;
import
java.util.HashMap
;
...
...
@@ -50,8 +51,19 @@ public class NamespaceService {
return
namespaceAPI
.
findPublicAppNamespaces
(
portalSettings
.
getFirstEnv
());
}
public
NamespaceDTO
save
(
Env
env
,
NamespaceDTO
namespace
){
return
namespaceAPI
.
save
(
env
,
namespace
);
public
NamespaceDTO
createNamespace
(
Env
env
,
NamespaceDTO
namespace
){
return
namespaceAPI
.
createNamespace
(
env
,
namespace
);
}
public
void
createAppNamespace
(
AppNamespaceDTO
appNamespace
)
{
for
(
Env
env
:
portalSettings
.
getEnvs
())
{
try
{
namespaceAPI
.
createAppNamespace
(
env
,
appNamespace
);
}
catch
(
HttpStatusCodeException
e
)
{
logger
.
error
(
ExceptionUtils
.
toString
(
e
));
throw
e
;
}
}
}
/**
...
...
apollo-portal/src/main/resources/static/config.html
View file @
f60ee3e2
...
...
@@ -83,7 +83,7 @@
<!--</div>-->
<!--</a>-->
<a
class=
"list-group-item"
target=
"_blank"
href=
"namespace.html?#/appid={{pageContext.appId}}
"
>
<a
class=
"list-group-item"
href=
"namespace.html?#/appid={{pageContext.appId}}&type=link
"
>
<div
class=
"row"
>
<div
class=
"col-md-2"
><img
src=
"img/plus.png"
class=
"i-20"
></div>
<div
class=
"col-md-7 hidden-xs"
>
...
...
@@ -294,7 +294,7 @@
{{watch.value}}
<div
ng-show=
"watch.oldValue"
>
<hr>
老的值:
{{watch.oldValue}}
<b>
已发布的值:
</b>
{{watch.oldValue}}
</div>
</div>
<div
class=
"modal-footer"
>
...
...
apollo-portal/src/main/resources/static/config/sync.html
View file @
f60ee3e2
...
...
@@ -33,7 +33,7 @@
</button>
<button
type=
"button"
class=
"btn btn-success"
ng-show=
"syncItemStep == 2 && hasDiff"
ng-click=
"syncItems()"
>
同步
</button>
<button
type=
"button"
class=
"btn btn-
primary
"
data-dismiss=
"modal"
ng-show=
"syncItemStep == 3"
<button
type=
"button"
class=
"btn btn-
success
"
data-dismiss=
"modal"
ng-show=
"syncItemStep == 3"
ng-click=
"backToAppHomePage()"
>
返回
</button>
</div>
...
...
apollo-portal/src/main/resources/static/namespace.html
View file @
f60ee3e2
...
...
@@ -5,8 +5,8 @@
<!-- styles -->
<link
rel=
"stylesheet"
type=
"text/css"
href=
"vendor/bootstrap/css/bootstrap.min.css"
>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"vendor/angular/angular-toastr-1.4.1.min.css"
>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"vendor/select2/select2.min.css"
>
<link
rel=
"stylesheet"
type=
"text/css"
media=
'all'
href=
"vendor/angular/loading-bar.min.css"
>
<link
href=
"http://cdn.bootcss.com/select2/4.0.2-rc.1/css/select2.css"
rel=
"stylesheet"
>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styles/common-style.css"
>
<title>
新建Namespace
</title>
</head>
...
...
@@ -15,26 +15,32 @@
<div
ng-include=
"'views/common/nav.html'"
></div>
<div
class=
"container-fluid apollo-container"
>
<div
class=
"container-fluid apollo-container"
ng-controller=
"LinkNamespaceController"
>
<div
class=
"row"
>
<div
class=
"col-md-8 col-md-offset-2"
>
<div
class=
"panel"
>
<header
class=
"panel-heading"
>
新建Namespace
<div
class=
"row"
>
<div
class=
"col-md-6"
>
新建Namespace
</div>
<div
class=
"col-md-6 text-right"
>
<button
type=
"button"
class=
"btn btn-success"
ng-show=
"step == 2"
ng-click=
"back()"
>
返回
</button>
</div>
</div>
</header>
<div
class=
"panel-body"
>
<form
class=
"form-horizontal"
ng-controller=
"LinkNamespaceController"
ng-submit=
"sav
eNamespace()"
>
<form
class=
"form-horizontal"
ng-show=
"step == 1"
ng-submit=
"creat
eNamespace()"
>
<div
class=
"form-group"
>
<label
class=
"col-sm-3 control-label"
>
应用ID
</label>
<div
class=
"col-sm-6"
>
{{appId}}
</div>
</div>
<div
class=
"form-horizontal"
>
<div
class=
"form-horizontal"
ng-show=
"type == 'link'"
>
<div
class=
"form-group"
>
<label
class=
"col-sm-3 control-label"
>
选择集群
</label>
<label
class=
"col-sm-3 control-label"
>
<font
style=
"color: red"
>
*
</font>
选择集群
</label>
<div
class=
"col-sm-6"
>
<table
class=
"table table-hover"
>
<thead>
...
...
@@ -57,24 +63,19 @@
</div>
</div>
</div>
<div
class=
"form-group"
ng-show=
"
isRootUser
"
>
<label
class=
"col-sm-3 control-label"
><font
style=
"color: red"
>
*
</font>
namespace类型
</label>
<div
class=
"form-group"
ng-show=
"
type == 'create'
"
>
<label
class=
"col-sm-3 control-label"
><font
style=
"color: red"
>
*
</font>
名称
</label>
<div
class=
"col-sm-4"
>
<label
class=
"radio-inline"
>
<input
type=
"radio"
name=
"x"
ng-checked=
"namespaceType == 1"
ng-click=
"selectNamespaceType(1)"
>
关联
</label>
<label
class=
"radio-inline"
>
<input
type=
"radio"
name=
"x"
ng-checked=
"namespaceType == 2"
ng-click=
"selectNamespaceType(2)"
>
新建
</label>
<input
type=
"text"
class=
"form-control"
ng-model=
"appNamespace.name"
ng-required=
"type == 'create'"
>
</div>
</div>
<div
class=
"form-group"
ng-show=
"
namespaceType == 2
"
>
<label
class=
"col-sm-3 control-label"
>
<font
style=
"color: red"
>
*
</font>
namespace
</label>
<div
class=
"col-sm-
4
"
>
<input
type=
"text"
class=
"form-control"
placeholder=
"输入namespace名称"
>
<div
class=
"form-group"
ng-show=
"
type == 'create'
"
>
<label
class=
"col-sm-3 control-label"
>
备注
</label>
<div
class=
"col-sm-
7
"
>
<textarea
class=
"form-control"
rows=
"3"
ng-model=
"appNamespace.comment"
></textarea
>
</div>
</div>
<div
class=
"form-group"
ng-show=
"
namespaceType == 1
"
>
<div
class=
"form-group"
ng-show=
"
type == 'link'
"
>
<label
class=
"col-sm-3 control-label"
><font
style=
"color: red"
>
*
</font>
namespace
</label>
<div
class=
"col-sm-4"
>
<select
id=
"namespaces"
>
...
...
@@ -84,11 +85,16 @@
</div>
<div
class=
"form-group"
>
<div
class=
"col-sm-offset-
2
col-sm-10"
>
<div
class=
"col-sm-offset-
3
col-sm-10"
>
<button
type=
"submit"
class=
"btn btn-default"
>
提交
</button>
</div>
</div>
</form>
<div
class=
"row text-center"
ng-show=
"step == 2"
>
<img
src=
"img/sync-succ.png"
style=
"height: 100px; width: 100px"
>
<h3>
创建成功!
</h3>
</div>
</div>
</div>
</div>
...
...
@@ -107,7 +113,8 @@
<!-- jquery.js -->
<script
src=
"vendor/jquery.js"
type=
"text/javascript"
></script>
<script
src=
"http://cdn.bootcss.com/select2/4.0.2-rc.1/js/select2.min.js"
></script>
<script
src=
"vendor/select2/select2.min.js"
type=
"text/javascript"
></script>
<!-- bootstrap.js -->
<script
src=
"vendor/bootstrap/js/bootstrap.min.js"
type=
"text/javascript"
></script>
...
...
@@ -117,7 +124,7 @@
<script
type=
"application/javascript"
src=
"scripts/services/NamespaceService.js"
></script>
<script
type=
"application/javascript"
src=
"scripts/AppUtils.js"
></script>
<script
type=
"application/javascript"
src=
"scripts/controller/
Link
NamespaceController.js"
></script>
<script
type=
"application/javascript"
src=
"scripts/controller/NamespaceController.js"
></script>
</body>
...
...
apollo-portal/src/main/resources/static/scripts/AppUtils.js
View file @
f60ee3e2
...
...
@@ -22,13 +22,6 @@ appUtil.service('AppUtil', [function () {
result
[
kv
[
0
]]
=
kv
[
1
];
});
return
result
;
},
cutOffString
:
function
(
str
,
maxLength
)
{
if
(
!
str
||
maxLength
<=
0
)
{
return
''
;
}
return
str
.
length
>
maxLength
?
str
.
substr
(
0
,
maxLength
)
:
str
;
}
}
}]);
apollo-portal/src/main/resources/static/scripts/controller/
Link
NamespaceController.js
→
apollo-portal/src/main/resources/static/scripts/controller/NamespaceController.js
View file @
f60ee3e2
...
...
@@ -4,7 +4,9 @@ application_module.controller("LinkNamespaceController",
var
params
=
AppUtil
.
parseParams
(
$location
.
$$url
);
$scope
.
appId
=
params
.
appid
;
$scope
.
isRootUser
=
params
.
root
?
true
:
false
;
$scope
.
type
=
params
.
type
;
$scope
.
step
=
1
;
////// load env //////
AppService
.
load_nav_tree
(
$scope
.
appId
).
then
(
function
(
result
)
{
...
...
@@ -37,25 +39,49 @@ application_module.controller("LinkNamespaceController",
toastr
.
error
(
AppUtil
.
errorMsg
(
result
),
"load public namespace error"
);
});
$scope
.
saveNamespace
=
function
()
{
$scope
.
appNamespace
=
{
appId
:
$scope
.
appId
,
name
:
''
,
comment
:
''
};
$scope
.
createNamespace
=
function
()
{
if
(
$scope
.
type
==
'link'
){
var
selectedClusters
=
collectSelectedClusters
();
if
(
selectedClusters
.
length
==
0
){
toastr
.
warning
(
"请选择集群"
);
return
;
}
var
namespaceName
=
$
(
'#namespaces'
).
select2
(
'data'
)[
0
].
id
;
var
selectedClustersSize
=
selectedClusters
.
length
;
if
(
$scope
.
namespaceType
==
1
){
$scope
.
namespaceName
=
$
(
'#namespaces'
).
select2
(
'data'
)[
0
].
id
;
}
var
hasCreatedClusterCnt
=
0
;
selectedClusters
.
forEach
(
function
(
cluster
)
{
NamespaceService
.
sav
e
(
$scope
.
appId
,
cluster
.
env
,
cluster
.
clusterName
,
namespaceName
).
then
(
function
(
result
)
{
NamespaceService
.
createNamespac
e
(
$scope
.
appId
,
cluster
.
env
,
cluster
.
clusterName
,
$scope
.
namespaceName
).
then
(
function
(
result
)
{
toastr
.
success
(
cluster
.
env
+
"_"
+
result
.
clusterName
+
"_"
+
result
.
namespaceName
+
"创建成功"
);
hasCreatedClusterCnt
++
;
if
(
hasCreatedClusterCnt
==
selectedClustersSize
){
$scope
.
step
=
2
;
}
},
function
(
result
)
{
toastr
.
error
(
AppUtil
.
errorMsg
(
result
),
cluster
.
env
+
"_"
+
cluster
.
clusterName
+
"_"
+
namespaceName
+
"创建失败"
);
+
$scope
.
namespaceName
+
"创建失败"
);
});
})
});
}
else
{
NamespaceService
.
createAppNamespace
(
$scope
.
appId
,
$scope
.
appNamespace
).
then
(
function
(
result
)
{
$scope
.
step
=
2
;
},
function
(
result
)
{
toastr
.
error
(
AppUtil
.
errorMsg
(
result
),
"创建失败"
);
});
}
};
var
envAllSelected
=
false
;
...
...
@@ -85,6 +111,10 @@ application_module.controller("LinkNamespaceController",
$scope
.
switchSelect
=
function
(
o
)
{
o
.
checked
=
!
o
.
checked
;
}
};
$scope
.
back
=
function
()
{
$window
.
location
.
href
=
'/config.html?#appid='
+
$scope
.
appId
;
};
}]);
apollo-portal/src/main/resources/static/scripts/controller/app/AppConfigController.js
View file @
f60ee3e2
...
...
@@ -121,6 +121,7 @@ application_module.controller("AppConfigController",
namespace
.
viewType
=
viewType
;
};
var
MAX_ROW_SIZE
=
30
;
//把表格内容解析成文本
function
parseModel2Text
(
namespace
)
{
...
...
@@ -139,8 +140,7 @@ application_module.controller("AppConfigController",
itemCnt
++
;
});
itemCnt
=
itemCnt
>
30
?
30
:
itemCnt
;
namespace
.
itemCnt
=
itemCnt
+
3
;
namespace
.
itemCnt
=
itemCnt
>
MAX_ROW_SIZE
?
MAX_ROW_SIZE
:
itemCnt
+
3
;
return
result
;
}
...
...
apollo-portal/src/main/resources/static/scripts/services/NamespaceService.js
View file @
f60ee3e2
...
...
@@ -5,10 +5,15 @@ appService.service("NamespaceService", ['$resource', '$q', function ($resource,
isArray
:
true
,
url
:
'/appnamespaces/public'
},
sav
e
:
{
createNamespac
e
:
{
method
:
'POST'
,
url
:
'/apps/:appId/envs/:env/clusters/:clusterName/namespaces'
,
isArray
:
false
},
createAppNamespace
:
{
method
:
'POST'
,
url
:
'/apps/:appId/appnamespaces'
,
isArray
:
false
}
});
...
...
@@ -22,9 +27,9 @@ appService.service("NamespaceService", ['$resource', '$q', function ($resource,
});
return
d
.
promise
;
},
sav
e
:
function
(
appId
,
env
,
clusterName
,
namespaceName
)
{
createNamespac
e
:
function
(
appId
,
env
,
clusterName
,
namespaceName
)
{
var
d
=
$q
.
defer
();
namespace_source
.
sav
e
({
namespace_source
.
createNamespac
e
({
appId
:
appId
,
env
:
env
,
clusterName
:
clusterName
...
...
@@ -38,6 +43,17 @@ appService.service("NamespaceService", ['$resource', '$q', function ($resource,
d
.
reject
(
result
);
});
return
d
.
promise
;
},
createAppNamespace
:
function
(
appId
,
appnamespace
)
{
var
d
=
$q
.
defer
();
namespace_source
.
createAppNamespace
({
appId
:
appId
},
appnamespace
,
function
(
result
)
{
d
.
resolve
(
result
);
},
function
(
result
)
{
d
.
reject
(
result
);
});
return
d
.
promise
;
}
}
...
...
apollo-portal/src/main/resources/static/styles/common-style.css
View file @
f60ee3e2
...
...
@@ -7,7 +7,6 @@ body {
padding
:
0px
!important
;
margin
:
0px
!important
;
font-size
:
13px
;
/*min-height: 650px;*/
background
:
#f1f2f7
;
font-family
:
'Open Sans'
,
sans-serif
;
}
...
...
apollo-portal/src/main/resources/static/vendor/select2/select2.min.css
0 → 100644
View file @
f60ee3e2
This diff is collapsed.
Click to expand it.
apollo-portal/src/main/resources/static/vendor/select2/select2.min.js
0 → 100644
View file @
f60ee3e2
This diff is collapsed.
Click to expand it.
apollo-portal/src/main/resources/static/views/common/footer.html
View file @
f60ee3e2
...
...
@@ -2,6 +2,7 @@
<hr>
<p
class=
"text-center"
>
<span
class=
"glyphicon glyphicon-copyright-mark"
aria-hidden=
"true"
></span>
携程 框架研发部
<br>
<a
href=
"http://conf.ctripcorp.com/display/FRAM/Apollo"
target=
"_blank"
>
wiki
</a>
</p>
</div>
...
...
apollo-portal/src/test/java/com/ctrip/apollo/portal/AppServiceTest.java
View file @
f60ee3e2
...
...
@@ -71,9 +71,9 @@ public class AppServiceTest {
// appDTO.setOwnerEmail("qq@qq.com");
// appDTO.setOwnerName("zz");
//
// when(appService.
save
(appDTO)).thenReturn(appDTO);
// when(appService.
createApp
(appDTO)).thenReturn(appDTO);
//
// AppDTO createApp = appService.
save
(appDTO);
// AppDTO createApp = appService.
createApp
(appDTO);
//
// assertEquals(appId, createApp.getAppId());
// assertEquals(appName, createApp.getName());
...
...
apollo-portal/src/test/java/com/ctrip/apollo/portal/ServiceExceptionTest.java
View file @
f60ee3e2
...
...
@@ -60,7 +60,7 @@ public class ServiceExceptionTest extends AbstractPortalTest {
HttpStatusCodeException
adminException
=
new
HttpServerErrorException
(
HttpStatus
.
INTERNAL_SERVER_ERROR
,
"admin server error"
,
new
Gson
().
toJson
(
errorAttributes
).
getBytes
(),
Charset
.
defaultCharset
());
when
(
appAPI
.
save
(
any
(
Env
.
class
),
any
(
AppDTO
.
class
))).
thenThrow
(
adminException
);
when
(
appAPI
.
createApp
(
any
(
Env
.
class
),
any
(
AppDTO
.
class
))).
thenThrow
(
adminException
);
AppDTO
dto
=
generateSampleDTOData
();
try
{
...
...
Write
Preview
Markdown
is supported
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