On-Demand 설치 가이드

1. 문서 개요

1.1. 목적

본 문서(개발가이드_온디멘드)는 개방형 클라우드 플랫폼 프로젝트의 온디멘드 서비스 개발 표준을 가이드하는 문서로써, 온디멘드 서비스 아키텍처부터 테스트 까지의 내용을 포함하고 있다.
본 가이드 문서를 통해 온디멘드 서비스에 대한 이해도를 높여, 온디멘드 서비스 개발의 효율성과 유지보수성을 향상시키고자 한다. 또한 제시된 표준에 따라 개발된 온디멘드 서비스는 개방형 클라우드 플랫폼에서의 기능성(Functionality)과 통합성(Integrability)를 보장한다.

1.2. 범위

본 문서의 범위는 개방형 클라우드 플랫폼 프로젝트와 관련된 온디멘드 서비스 개발에 대한 내용으로 한정하며, 기타 오픈소스 도입의 경우 예외를 둔다.

1.3. 참고자료

2. 온디멘드 서비스 개요

온디멘드 서비스 브로커는 자바 스프링 프레임워크를 사용하여 개발한다. 온디멘드는 사용자가 서비스 요청시 공급자가 서비스를 생산해 제공하기 때문에 무분별한 자원 낭비를 방지한다. 현재 온디멘드 서비스는 데이케이트 형식으로만 제공한다. 본 장에서는 사용되는 용어들을 정의하고, 온디멘드 아키텍처를 설명한다.

2.1. 온디멘드 서비스 아키텍쳐 및 프로세스

그림 2-1 개방형 클라우드 플랫폼에서의 온디멘드 서비스 아키텍쳐
그림 2-2 개방형 클라우드 플랫폼에서의 온디멘드 서비스 프로세스
개방형 클라우드 플랫폼에 배포되는 온디멘드 서비스는 크게 서비스 신청(Create_Service), 서비스 바인딩(Service_binding), 서비스 준비(Service_inprogress), 서비스 삭제(Service_delete) 4가지의 프로세스를 제공한다.
사용자가 개방형 클라우드 플랫폼에 어플리케이션 배포를 요청하면, 배포 프로세스가 시작된다. 각 단계는 다음과 같은 동작을 한다.
  • 서비스 신청(Create_Service): 서비스 생성 요청시 서비스를 생성한다.
  • 서비스 준비(Service_inprogress): 서비스 구동시 필요한 VM을 생성한다.
  • 서비스 바인딩(Service_binding): 서비스의 환경설정을 어플리케이션 환경설정에 적용한다.
  • 서비스 삭제(Service_delete): 사용자 요청시 서비스 삭제 및 VM 가동을 삭제(중지)한다.
사용자가 서비스 신청을 하면 서비스를 구동하기위한 VM생성을 진행한다. 진행중 서비스는 준비상태로 전환되며 VM이 생성완료되고 난 후 해당 서비스는 완료상태로 전환되며 사용자에게 서비스를 제공한다.

2.2. 용어 정의

아키텍처 설명에 앞서, 본 문서에서 사용하는 몇가지 용어들을 정리하면 다음과 같다.
  • 온디멘드(On-Demand): '요구만 있으면 (언제든지)'~ 즉,
    공급 중심이 아니라 수요가 모든 것을 결정하는 시스템이나
    전략 등을 총칭한다.
  • 어플리케이션(application): 개방형 클라우드 플랫폼에서 어플리케이션은 배포의 단위이다. 즉, 소스코드 또는 패키징된 형태(예를 들면, .war)의 파일과 배포 시 사용할 부가정보(meta)들을 정의한 파일의 조합을 의미한다.
  • 서비스(Service): 서비스는 Service Broker API 라고 불리우는 cloud controller 클라이언트 API를 구현하여 개방형 클라우드 플랫폼에서 사용된다. Services API는 독립적인 cloud controller API의 버전이다. 이는 플랫폼에서 외부 application을 이용 가능하게 한다.

3. 온디멘드 서비스 브로커 API

개방형 클라우드 플랫폼 Service API는 Cloud Controller와 Service Broker 사이의 규약을 정의한다. Broker는 HTTP (or HTTPS) endpoints URI 형식으로 구현된다. 하나 이상의 Service가 하나의 Broker 에 의해 제공 될 수 있고, 로드 밸런싱과 수평 확장성이 가능하게 제공 될 수 있다.

3.1. Service Architecture

Services 는 Service Broker API 라고 불리우는 cloud controller 클라이언트 API를 구현하여 개방형 클라우드 플랫폼에서 사용된다. Services API는 독립적인 cloud controller API의 버전이다. 이는 플랫폼에서 외부 application을 이용 가능하게 한다. (database, message queue, rest endpoint , etc)

3.2. Service Broker API Architecture

개방형 클라우드 플랫폼 Service API는 Cloud Controller 와 Service Broker 사이의 규약 (catalog, provision, deprovision, update provision plan, bind, unbind)이고 Service Broker 는 RESTful API 로 구현하고 Cloud Controller 에 등록한다.

3.3. Pivotal(Cloud Foundry) Marketplace Model

AppDirect: 클라우드 서비스 marketplace 및 관리 솔루션의 선두 업체이고 많은 글로벌 회사의 marketplace를 구축하였다. (삼성, Cloud Foundry, ETC) AppDirect는 Cloud Foundry 서비스 중개(brokerage) 기능과 부가 서비스를 제공한다.
Service Provider 및 Cloud Foundry 통합에 관련 설명

4. 온디멘드 서비스 브로커 API 개발 가이드

4.1. 개발 가이드

서비스의 구현 방법은 서비스 제공자(Provider) 와 개발자(developer)의 몫이다. 개방형 클라우드 플랫폼은 서비스 제공자가 6가지의 Service Broker API를 구현해야 한다. 이때 2.4 Pivotal Marketplace Model를 이용해서 AppDirect 에서 제공중인 서비스 제공자와 협의 하여 AppDirect 의 중개 기능을 이용해서 제공할수도 있다. 또한 Broker 는 별도의 애플리케이션으로 구현하든지 기존 서비스에 필요한 HTTP endpoint를 추가함으로써 구현 될 수 있다.
기본적인 서비스브로커 API가이드는 (문서 URL) 참고해서 개발을 진행한다. 현재 On-Demand 서비스 브로커 개발은 JAVA만 지원한다.
On-Demand 서비스 브로커의 환경파일 (application.yml)은 다음과 같다 {}의 값은 조건에 맞춰 넣어주면 된다. (deploy시 수정가능)
1
server:
2
port: 8080
3
4
bosh:
5
client_id: {bosh_client_admin_id}
6
client_secret: {bosh_client_secret}
7
url: {bosh_diretor_url}
8
oauth_url: {bosh_diretor_url:8443}
9
deployment_name: {on-demand-service-broker}
10
instance_name: {on-demand-service-instance name}
11
12
spring:
13
application:
14
name: paas-ta-on-demand-broker
15
datasource:
16
driver-class-name: com.mysql.jdbc.Driver
17
url: "jdbc:mysql://{on_demand_service_broker_database_url}/on-demand?autoReconnect=true&useUnicode=true&characterEncoding=utf8"
18
username: root
19
password: {Broker_Database_password}
20
jpa:
21
hibernate:
22
ddl-auto: none
23
database: mysql
24
show-sql: true
25
26
serviceDefinition:
27
id: 54e2de61-de84-4b9c-afc3-88d08aadfcb6
28
name: redis
29
desc: "A paasta source control service for application development.provision parameters : parameters {owner : owner}"
30
bindable: true
31
planupdatable: false
32
bullet:
33
name: 100
34
desc: 100
35
plan1:
36
id: 2a26b717-b8b5-489c-8ef1-02bcdc445720
37
name: dedicated-vm
38
desc: Redis service to provide a key-value store
39
type: A
40
org_limitation: 1
41
space_limitation: 1
42
43
cloudfoundry:
44
cc:
45
api:
46
url: https://api.{cloudfoundry_url}
47
uaaUrl: https://uaa.{cloudfoundry_url} # YOUR UAA API URL
48
sslSkipValidation: true
49
user:
50
admin:
51
username: {cloudfoundry_admin_id} # YOUR CF ADMIN ACCOUT
52
password: {cloudfoundry_admin_password}# YOUR CF ADMIN PASSWORD
53
54
instance:
55
password: admin_test
56
port: 6379
Copied!
4.2. 서비스 및 VM Instance 생성 API 가이드
참고: On-Demand 서비스 브로커는 Bosh API를 사용한다. On-Demand 형식을 구현하기 위한 Bosh API는 다음과 같다.
  1. 1.
    Bosh Api Setting
    1.1. BoshDirector
    Bosh Director에 로그인 및 토큰을 받아 저장 및 Bosh API 접근가능한 오브젝트를 생성한다.
parameter
1
client_id :: string
2
client_secret :: string
3
bosh_url :: string
4
oauth_url :: string
Copied!
Request
1
POST oauth_url + "/oauth/token?client_id=" + client_id + "&client_secret=" + client_secret + "&grant_type=client_credentials
Copied!
Response
1
OAuth2AccessToken
Copied!
  1. 1.
    ServiceInstace
    2.1 VMInstance
    Bosh에 배포된 VMInstance 정보를 가져온다.
parameter
1
deployment_name :: string
2
instance_name :: string
Copied!
Request
1
Get bosh_url + "/deployments/" + deployment_name + "/instances?format=full"
2
3
format=full로 조회하는 방식은 Bosh 자체적으로 task를 발생시켜 redirect로 테스크를 찾아 값을 반환하는 방식으로 되어있다.
4
5
기본 Resttemplate으로 api요청시 redirect 부분에서 오류가 발생하기 때문에 따로 redirect 기능을 하지 않게 Resttemplate을 생성해서 요청해야한다.
Copied!
Response
1
task :: string
Copied!
2.2. TaskResult Bosh task를 조회한다. (option :: output=result) 해당 deployment의 상세값을 확인할수 있다.
parameter
1
task :: string
Copied!
Request
1
Get bosh_url + "/deployments/" + deployment_name + "/instances?format=full"
2
3
format=full로 조회하는 방식은 Bosh 자체적으로 task를 발생시켜 redirect로 테스크를 찾아 값을 반환하는 방식으로 되어있다.
4
5
기본 Resttemplate으로 api요청시 redirect 부분에서 오류가 발생하기 때문에 따로 redirect 기능을 하지 않게 Resttemplate을 생성해서 요청해야한다.
Copied!
Response
1
result :: string
2
Bosh API에서 List<Map>형식으로 커스텀해 반환해준다.
Copied!
2.3. GetLock Deployment Update 하기전 해당 Deployment가 작업(Lock)여부 조회하는 기능이다.
parameter
1
null
Copied!
Request
1
Get bosh_url + "/locks"
Copied!
Response
1
result :: string
2
Bosh API에서 Json형식으로 반환해준다.
Copied!
2.4. UpdateInstance 해당 Instance상태를 업데이트한다 (stop --> start)
parameter
1
deployment_name :: string
2
instance_name :: string
3
instance_id :: string
4
type :: string
5
6
type은 "started" 또는 "detached"로 정한다.
Copied!
Request
1
Get bosh_url + "/deployments/" + deployment_name + "/jobs/" + job_name + "/" + job_id + "?state=" + state
Copied!
Response
1
null
Copied!
2.5. GetTaskID 현재 작업중인(state = queued, processing,cancelling) Task중 해당 deployment_name과 같은 ID를 조회한다.
parameter
1
deployment_name :: string
Copied!
Request
1
Get bosh_url + "/tasks?state=queued,processing,cancelling"
Copied!
Response
1
List<map>
Copied!
StartInstance
해당 Instance VM을 실행시킨다.(stop -> start)
parameter
1
task_id :: string
2
instance_name :: string
3
instance_id :: string
Copied!
Request
1
Get bosh_url + "/tasks/" + task_id + "/output?type=debug"
Copied!
Response
1
String
Copied!
CreateInstance
서비스 신청이 들어올 때 할당해줄 VM이 없을시 Instace 개수를 늘려 VM 하나를 생성하는 기능이다.
parameter
1
deployment_name :: string
2
instance_name :: string
Copied!
Request
1
Post bosh_url + "/deployments"
Copied!
body
bosh deploy할때 필요한 manifest.yml구성된 내용을 String으로 변환해서 담아야한다.
예시)
1
instance_groups:
2
- azs:
3
- z7
4
instances: 1
5
jobs:
6
- name: binary_storage
7
release: paasta-portal-api-release
8
name: binary_storage
9
networks:
10
- default:
11
- dns
12
- gateway
13
name: service_private
14
- name: service_public
15
persistent_disk: 102400
16
stemcell: default
17
vm_type: medium
18
- azs:
19
- z2
20
instances: 1
21
jobs:
22
- name: mariadb
23
release: common-infra
24
name: mariadb
25
networks:
26
- name: service_private
27
persistent_disk: 4096
28
stemcell: default
29
vm_type: small
30
name: common-infra-service
31
properties:
32
binary_storage:
33
auth_port: 5000
34
binary_desc:
35
- marketplace-container
36
container:
37
- marketplace-container
38
email:
41
password:
42
- paasta
43
proxy_ip:
44
proxy_port: 10008
45
tenantname:
46
- paasta-marketplace
47
username:
48
- paasta-marketplace
49
haproxy:
50
http_port: 8080
51
mariadb:
52
admin_user:
53
password: '!paas_ta202'
54
port: 3306
55
postgres:
56
datasource:
57
database: sonar
58
password: sonar
59
username: sonar
60
port: 5432
61
vcap_password: c1oudc0w
62
releases:
63
- name: paasta-portal-api-release
64
version: latest
65
- name: common-infra
66
version: latest
67
stemcells:
68
- alias: default
69
os: ubuntu-xenial
70
version: 315.36
71
update:
72
canaries: 1
73
canary_watch_time: 5000-120000
74
max_in_flight: 1
75
serial: false
76
update_watch_time: 5000-120000
Copied!
Response
1
null
Copied!
4.3. On-Demand Service-Broker 구현 소스 개발가이드
On-Demand 구현에 관련한 서비스 브로커 개발 가이드를 진행한다. 현재 JAVA 버전만 사용이 가능하다. 예시로 나와있는 소스는 PaaS-TA GitHub의 On-Demand-broker에서 찾아볼수 있다.
  1. 1.
    On-Demand ServiceInstace
    할당된 VM의 대한 정보를 broker DB에 ServiceIntance객제와 함께 저장한다.
예시)JpaServiceInstance Class
1
@Entity
2
@Table(name = "on_demand_info")
3
public class JpaServiceInstance extends ServiceInstance {
4
5
@JsonSerialize
6
@JsonProperty("service_instance_id")
7
@Id
8
@Column(name = "service_instance_id")
9
private String serviceInstanceId;
10
11
@JsonSerialize
12
@Column(name = "service_id")
13
@JsonProperty("service_id")
14
private String serviceDefinitionId;
15
16
@JsonSerialize
17
@Column(name = "plan_id")
18
@JsonProperty("plan_id")
19
private String planId;
20
21
@JsonSerialize
22
@Column(name = "organization_guid")
23
@JsonProperty("organization_guid")
24
private String organizationGuid;
25
26
@JsonSerialize
27
@Column(name = "space_guid")
28
@JsonProperty("space_guid")
29
private String spaceGuid;
30
31
@JsonSerialize
32
@Column(name = "dashboard_url")
33
@JsonProperty("dashboard_url")
34
private String dashboardUrl;
35
36
@Transient
37
@JsonIgnore
38
private boolean async;
39
40
@JsonSerialize
41
@JsonProperty("vm_instance_id")
42
@Column(name = "vm_instance_id")
43
private String vmInstanceId;
44
45
@JsonSerialize
46
@JsonProperty("app_guid")
47
@Column(name = "app_guid")
48
private String appGuid;
49
50
@JsonSerialize
51
@JsonProperty("task_id")
52
@Column(name = "task_id")
53
private String taskId;
54
55
@JsonSerialize
56
@JsonProperty("app_parameter")
57
@Column(name = "app_parameter")
58
private String app_parameter;
59
60
61
public JpaServiceInstance() {
62
super();
63
}
64
65
public JpaServiceInstance(CreateServiceInstanceRequest request) {
66
super(request);
67
setServiceDefinitionId(request.getServiceDefinitionId());
68
setPlanId(request.getPlanId());
69
setOrganizationGuid(request.getOrganizationGuid());
70
setSpaceGuid(request.getSpaceGuid());
71
setServiceInstanceId(request.getServiceInstanceId());
72
AtomicReference<String> param = new AtomicReference<>("{");
73
AtomicInteger i = new AtomicInteger(1);
74
try {
75
if (request.getParameters() != null) {
76
request.getParameters().forEach((key, value) -> {
77
if (key.equals("app_guid")) {
78
setAppGuid(value.toString());
79
}
80
param.set(param.get() + "\"" + key + "\":\"" + value.toString() + "\"");
81
if (i.get() < request.getParameters().size()) {
82
param.set(param.get() + ",");
83
}
84
i.set(i.get() + 1);
85
});
86
}
87
}catch (Exception e){
88
}
89
param.set(param.get() + "}");
90
setApp_parameter(param.get());
91
}
92
93
@Override
94
public String getDashboardUrl() {
95
return dashboardUrl;
96
}
97
98
public void setDashboardUrl(String dashboardUrl) {
99
this.dashboardUrl = dashboardUrl;
100
}
101
102
public String getAppGuid() {
103
return appGuid;
104
}
105
106
public void setAppGuid(String appGuid) {
107
this.appGuid = appGuid;
108
}
109
110
public String getTaskId() {
111
return taskId;
112
}
113
114
public void setTaskId(String taskId) {
115
this.taskId = taskId;
116
}
117
118
@Override
119
public String getPlanId() {
120
return planId;
121
}
122
123
public void setPlanId(String planId) {
124
this.planId = planId;
125
}
126
127
@Override
128
public String getServiceDefinitionId() {
129
return serviceDefinitionId;
130
}
131
132
public void setServiceDefinitionId(String serviceDefinitionId) {
133
this.serviceDefinitionId = serviceDefinitionId;
134
}
135
136
@Override
137
public String getServiceInstanceId() {
138
return serviceInstanceId;
139
}
140
141
public void setServiceInstanceId(String serviceInstanceId) {
142
this.serviceInstanceId = serviceInstanceId;
143
}
144
145
@Override
146
public String getSpaceGuid() {
147
return spaceGuid;
148
}
149
150
public void setSpaceGuid(String spaceGuid) {
151
this.spaceGuid = spaceGuid;
152
}
153
154
@Override
155
public String getOrganizationGuid() {
156
return organizationGuid;
157
}
158
159
public void setOrganizationGuid(String organizationGuid) {
160
this.organizationGuid = organizationGuid;
161
}
162
163
public String getVmInstanceId() {
164
return vmInstanceId;
165
}
166
167
public void setVmInstanceId(String vmInstanceId) {
168
this.vmInstanceId = vmInstanceId;
169
}
170
171
@Override
172
public boolean isAsync() {
173
return async;
174
}
175
176
@Override
177
public ServiceInstance and() {
178
return this;
179
}
180
181
@Override
182
public JpaServiceInstance withDashboardUrl(String dashboardUrl) {
183
this.dashboardUrl = dashboardUrl;
184
return this;
185
}
186
187
@Override
188
public ServiceInstance withAsync(boolean async) {
189
this.async = async;
190
return this;
191
}
192
193
194
public String getApp_parameter() {
195
return app_parameter;
196
}
197
198
public void setApp_parameter(String app_parameter) {
199
this.app_parameter = app_parameter;
200
}
201
202
public void setAsync(boolean async) {
203
this.async = async;
204
}
205
206
@Override
207
public String toString() {
208
return "JpaServiceInstance{" +
209
"serviceInstanceId='" + serviceInstanceId + '\'' +
210
", serviceDefinitionId='" + serviceDefinitionId + '\'' +
211
", planId='" + planId + '\'' +
212
", organizationGuid='" + organizationGuid + '\'' +
213
", spaceGuid='" + spaceGuid + '\'' +
214
", dashboardUrl='" + dashboardUrl + '\'' +
215
", async=" + async +
216
", vmInstanceId='" + vmInstanceId + '\'' +
217
", appGuid='" + appGuid + '\'' +
218
", taskId='" + taskId + '\'' +
219
'}';
220
}
221
}
Copied!
◎ 1.1. On-Demand-broker에서 커스텀한 변수의 대한 설명
vm_instance_id : 서비스 인스턴스에 할당할 VM의 Instance Id
appGuid : 서비스 바인딩을 진행할 application의 Guid
taskId : 서비스에 할당할 VM작업을 진행하는 BOSH의 task Id
◎ 1.2. JPAInstance(CreateServiceInstanceRequest request) 생성자
PaaS-TA Portal을 이용한 앱 템플릿을 사용하기 위해 임의로 지정한 키에 할당된 서비스 파라미터 값을 받아 appGuid에 할당한다.
1
예시)
2
public JpaServiceInstance(CreateServiceInstanceRequest request) {
3
super(request);
4
setServiceDefinitionId(request.getServiceDefinitionId());
5
setPlanId(request.getPlanId());
6
setOrganizationGuid(request.getOrganizationGuid());
7
setSpaceGuid(request.getSpaceGuid());
8
setServiceInstanceId(request.getServiceInstanceId());
9
AtomicReference<String> param = new AtomicReference<>("{");
10
AtomicInteger i = new AtomicInteger(1);
11
try {
12
if (request.getParameters() != null) {
13
request.getParameters().forEach((key, value) -> {
14
if (key.equals("app_guid")) {
15
setAppGuid(value.toString());
16
}
17
param.set(param.get() + "\"" + key + "\":\"" + value.toString() + "\"");
18
if (i.get() < request.getParameters().size()) {
19
param.set(param.get() + ",");
20
}
21
i.set(i.get() + 1);
22
});
23
}
24
}catch (Exception e){
25
}
26
param.set(param.get() + "}");
27
setApp_parameter(param.get());
28
}
Copied!
  1. 1.
    On-Demand createServiceInstance
    사용자가 서비스를 신청할 경우 과정에서 VM 재기동 또는 생성을 진행한다.
1.1. Deployment가 현재 구성이 제대로 되어있는지 확인 및 Instance List를 가져온다.
1
Copied!
1.1. 에서 에러가 날 경우 서비스 생성을 중지한다.
1
예시)
2
List<DeploymentInstance> deploymentInstances = onDemandDeploymentService.getVmInstance(deployment_name, instance_name);
3
if (deploymentInstances == null) {
4
throw new ServiceBrokerException(deployment_name + " is Working");
5
}
Copied!
1.2. Instance List중 유휴 VM이 있을경우 해당 VM정보가 저장된 Service Instance를 생성해 제공한다.
1
예시)
2
List<DeploymentInstance> startedDeploymentInstances = deploymentInstances.stream().filter((x) -> x.getState().equals(BoshDirector.INSTANCE_STATE_START) && x.getJobState().equals("running")).collect(Collectors.toList());
3
for(DeploymentInstance dep : startedDeploymentInstances){
4
if(jpaServiceInstanceRepository.findByVmInstanceId(dep.getId()) == null){
5
jpaServiceInstance.setVmInstanceId(dep.getId());
6
jpaServiceInstance.setDashboardUrl(dep.getIps().substring(1,dep.getIps().length()-1));
7
jpaServiceInstanceRepository.save(jpaServiceInstance);
8
jpaServiceInstance.withAsync(true);
9
SecurityGroups securityGroups = common.cloudFoundryClient().securityGroups();
10
cloudFoundryService.SecurityGurop(request.getSpaceGuid(), jpaServiceInstance.getDashboardUrl(), securityGroups);
11
logger.info("서비스 인스턴스 생성");
12
return jpaServiceInstance;
13
}
14
}
Copied!
1.3. 유휴 VM이 없을경우 Instance를 업데이트 하기 전 현재 Deployment가 Lock인 상태인지 체크한다. Lock인 상태인 경우엔 "생성할 수 없습니다." 에러를 발생시킨다.
1
예시)
2
if (onDemandDeploymentService.getLock(deployment_name)) {
3
throw new ServiceBrokerException(deployment_name + " is Working");
4
}
Copied!
1.4. 정지상태인 VM을 찾아 있을경우 해당 VM을 실행시키며 해당 VM정보를 가진 Service Instance를 생성해 제공한다.
1
예시)
2
List<DeploymentInstance> detachedDeploymentInstances = deploymentInstances.stream().filter(x -> x.getState().equals(BoshDirector.INSTANCE_STATE_DETACHED)).collect(Collectors.toList());
3
String taskID = "";
4
for (DeploymentInstance dep : detachedDeploymentInstances) {
5
onDemandDeploymentService.updateInstanceState(deployment_name, instance_name, dep.getId(), BoshDirector.INSTANCE_STATE_START);
6
while (true) {
7
Thread.sleep(1000);
8
taskID = onDemandDeploymentService.getTaskID(deployment_name);
9
if (taskID != null) {
10
logger.info("taskID : " + taskID);
11
break;
12
}
13
}
14
String ips = "";
15
while (true) {
16
Thread.sleep(1000);
17
ips = onDemandDeploymentService.getStartInstanceIPS(taskID, instance_name, dep.getId());
18
if (ips != null) {
19
break;
20
}
21
}
22
jpaServiceInstance.setVmInstanceId(dep.getId());
23
jpaServiceInstance.setDashboardUrl(ips);
24
jpaServiceInstanceRepository.save(jpaServiceInstance);
25
jpaServiceInstance.withAsync(true);
26
SecurityGroups securityGroups = common.cloudFoundryClient().securityGroups();
27
cloudFoundryService.SecurityGurop(request.getSpaceGuid(), jpaServiceInstance.getDashboardUrl(), securityGroups);
28
return jpaServiceInstance;
29
}
Copied!
1.5. 1.4.에서 정지된 VM이 없을경우 해당 Deployment의 manifest를 수정해 Service Instance에 필요한 VM을 늘린 후 해당 정보를 가진 Instance를 생성해 제공한다.
1
예시)
2
onDemandDeploymentService.createInstance(deployment_name, instance_name);
3
while (true) {
4
Thread.sleep(1000);
5
taskID = onDemandDeploymentService.getTaskID(deployment_name);
6
if (taskID != null) {
7
logger.info("Create Instance taskID : " + taskID);
8
break;
9
}
10
}
11
String ips = "";
12
while (true) {
13
Thread.sleep(1000);
14
ips = onDemandDeploymentService.getUpdateInstanceIPS(taskID);
15
if (ips != null) {
16
break;
17
}
18
}
19
String instanceId = "";
20
while (true) {
21
Thread.sleep(1000);
22
instanceId = onDemandDeploymentService.getUpdateVMInstanceID(taskID, instance_name);
23
if (instanceId != null) {
24
break;
25
}
26
}
27
jpaServiceInstance.setDashboardUrl(ips);
28
jpaServiceInstance.setVmInstanceId(instanceId);
29
jpaServiceInstanceRepository.save(jpaServiceInstance);
30
jpaServiceInstance.withAsync(true);
31
SecurityGroups securityGroups = common.cloudFoundryClient().securityGroups();
32
cloudFoundryService.SecurityGurop(request.getSpaceGuid(), jpaServiceInstance.getDashboardUrl(), securityGroups);
33
return jpaServiceInstance;
Copied!
  1. 1.
    On-Demand getOperationServiceInstance
1.1. 현재 Bosh의 Task를 조회해 running task중 Deployment가 포함되어있으면 inprogress 상태를 반환 없을경우 succeed 상태를 반환한다.
1
CloudController에서 null을 반환받을경우 inprogress를 최종적으로 반환한다.
2
반대로 instance값을 전달받을경우 succeed를 반환한다.
3
예시)
4
public JpaServiceInstance getOperationServiceInstance(String Instanceid) {
5
JpaServiceInstance instance = jpaServiceInstanceRepository.findByServiceInstanceId(Instanceid);
6
if (onDemandDeploymentService.runningTask(deployment_name, instance)) {
7
logger.info("인스턴스 생성완료");
8
ExecutorService executor = Executors.newSingleThreadExecutor();
9
CompletableFuture.runAsync(() -> {
10
try {
11
if (instance.getAppGuid() != null) {
12
ServiceBindingsV2 serviceBindingsV2 = common.cloudFoundryClient().serviceBindingsV2();
13
ApplicationsV2 applicationsV2 = common.cloudFoundryClient().applicationsV2();
14
cloudFoundryService.ServiceInstanceAppBinding(instance.getAppGuid(), instance.getServiceInstanceId(), (Map) this.objectMapper.readValue(instance.getApp_parameter(), Map.class), serviceBindingsV2, applicationsV2);
15
}
16
} catch (Exception e) {
17
logger.error(e.getMessage());
18
}
19
}, executor);
20
return instance;
21
}
22
logger.info("인스턴스 생성중");
23
return null;
24
}
Copied!
  1. 1.
    On-Demand deleteServiceInstance
1.1. Service Instance를 제거해 반환한다. 1.2. 비동기방식으로 삭제한 Instance에 할당된 VM을 중지시키기 위한 준비를 한다.
해당 Deployment가 Lock상태인지 조회한다. Lock인경우 15초 뒤에 다시 조회후 Lock이 아닌 경우 해당 VM을 중지시킨다.
1
예시)
2
ExecutorService executor = Executors.newSingleThreadExecutor();
3
CompletableFuture.runAsync(() -> {
4
lock.lock();
5
try {
6
while (true) {
7
if (onDemandDeploymentService.getLock(deployment_name)) {
8
Thread.sleep(15000);
9
continue;
10
}
11
onDemandDeploymentService.updateInstanceState(deployment_name, instance_name, instance.getVmInstanceId(), BoshDirector.INSTANCE_STATE_DETACHED);
12
cloudFoundryService.DelSecurityGurop(common.cloudFoundryClient().securityGroups(), instance.getSpaceGuid(), instance.getDashboardUrl());
13
logger.info("VM DETACHED SUCCEED : VM_ID : " + instance.getVmInstanceId());
14
break;
15
}
16
} catch (InterruptedException e) {
17
logger.error(e.getMessage());
18
}
19
lock.unlock();
20
}, executor);
Copied!
4.4. On-Demand 릴리즈 개발가이드
service를 Bosh release를 통해 배포 해야 하기 때문에 Bosh release 개발 방식에 따라 작성되어야한다.Bosh release 는 packages 와 jobs 관련 스크립트로 구성되어 있다.
  1. 1.
    On-Demand Release 기본구성
    1
    예시)
    2
    .
    3
    ├── README.md
    4
    ├── blobs
    5
    ├── config
    6
    │ ├── blobs.yml
    7
    │ └── final.yml
    8
    ├── create.sh
    9
    ├── delete.sh
    10
    ├── deployments
    11
    │ ├── deploy-vsphere.sh
    12
    │ ├── necessary_on_demand_vars.yml
    13
    │ ├── paasta_on_demand_service_broker.yml
    14
    │ └── unnecessary_on_demand_vars.yml
    15
    ├── jobs
    16
    │ ├── mariadb
    17
    │ │ ├── monit
    18
    │ │ ├── spec
    19
    │ │ └── templates
    20
    │ │ ├── bin
    21
    │ │ │ ├── mariadb_ctl.erb
    22
    │ │ │ ├── post-start
    23
    │ │ │ └── pre-start
    24
    │ │ └── conf
    25
    │ │ ├── init.sql
    26
    │ │ └── mariadb.cnf
    27
    │ ├── paas-ta-on-demand-broker
    28
    │ │ ├── monit
    29
    │ │ ├── spec
    30
    │ │ └── templates
    31
    │ │ ├── bin
    32
    │ │ │ ├── monit_debugger
    33
    │ │ │ └── service_ctl.erb
    34
    │ │ ├── data
    35
    │ │ │ ├── application.yml.erb
    36
    │ │ │ └── properties.sh
    37
    │ │ └── helpers
    38
    │ │ ├── ctl_setup.sh
    39
    │ │ └── ctl_utils.sh
    40
    ├── packages
    41
    │ ├── java
    42
    │ │ ├── packaging
    43
    │ │ └── spec
    44
    │ ├── mariadb
    45
    │ │ ├── packaging
    46
    │ │ └── spec
    47
    │ ├── paas-ta-on-demand-broker
    48
    │ │ ├── packaging
    49
    │ │ └── spec
    50
    └── src
    51
    ├── java
    52
    │ └── server-jre-8u121-linux-x64.tar.gz
    53
    ├── mariadb
    54
    │ └── mariadb-10.1.22-linux-x86_64.tar.gz
    55
    └── paas-ta-on-demand-broker
    56
    └── paas-ta-on-demand-broker.jar
    Copied!
  2. 2.
    해당서비스를 On-Demand로 적용시켜 Release를 개발할 경우 jobs, packages, src에 추가 해서 Release 파일을 생성하면 된다.
    1
    예시) On-Demand Redis Relases Tree
    2
    .
    3
    ├── README.md
    4
    ├── blobs
    5
    │ ├── aws-cli
    6
    │ ├── ginkgo
    7
    │ ├── go
    8
    │ ├── nginx
    9
    │ └── redis
    10
    │ └── redis-4.0.11.tar.gz
    11
    ├── config
    12
    │ ├── blobs.yml
    13
    │ └── final.yml
    14
    ├── create.sh
    15
    ├── delete.sh
    16
    ├── deployments
    17
    │ ├── deploy-vsphere.sh
    18
    │ ├── necessary_on_demand_vars.yml
    19
    │ ├── paasta_on_demand_service_broker.yml
    20
    │ └── unnecessary_on_demand_vars.yml
    21
    ├── jobs
    22
    │ ├── mariadb
    23
    │ │ ├── monit
    24
    │ │ ├── spec
    25
    │ │ └── templates
    26
    │ │ ├── bin
    27
    │ │ │ ├── mariadb_ctl.erb
    28
    │ │ │ ├── post-start
    29
    │ │ │ └── pre-start
    30
    │ │ └── conf
    31
    │ │ ├── init.sql
    32
    │ │ └── mariadb.cnf
    33
    │ ├── paas-ta-on-demand-broker
    34
    │ │ ├── monit
    35
    │ │ ├── spec
    36
    │ │ └── templates
    37
    │ │ ├── bin
    38
    │ │ │ ├── monit_debugger
    39
    │ │ │ └── service_ctl.erb
    40
    │ │ ├── data
    41
    │ │ │ ├── application.yml.erb
    42
    │ │ │ └── properties.sh
    43
    │ │ └── helpers
    44
    │ │ ├── ctl_setup.sh
    45
    │ │ └── ctl_utils.sh
    46
    │ ├── redis
    47
    │ │ ├── monit
    48
    │ │ ├── spec
    49
    │ │ └── templates
    50
    │ │ ├── bin
    51
    │ │ │ ├── health_check
    52
    │ │ │ └── pre_start.sh
    53
    │ │ └── config
    54
    │ │ ├── bpm.yml.erb
    55
    │ │ └── redis.conf.erb
    56
    │ └── sanity-tests
    57
    │ ├── monit
    58
    │ ├── spec
    59
    │ └── templates
    60
    │ └── bin
    61
    │ └── run
    62
    ├── packages
    63
    │ ├── java
    64
    │ │ ├── packaging
    65
    │ │ └── spec
    66
    │ ├── mariadb
    67
    │ │ ├── packaging
    68
    │ │ └── spec
    69
    │ ├── paas-ta-on-demand-broker
    70
    │ │ ├── packaging
    71
    │ │ └── spec
    72
    │ └── redis-4
    73
    │ ├── packaging
    74
    │ └── spec
    75
    └── src
    76
    ├── java
    77
    │ └── server-jre-8u121-linux-x64.tar.gz
    78
    ├── mariadb
    79
    │ └── mariadb-10.1.22-linux-x86_64.tar.gz
    80
    └── paas-ta-on-demand-broker
    81
    └── paas-ta-on-demand-broker.jar
    Copied!
  3. 3.
    Release 구성을 완료한 후에 bosh cli 명령어를 통해 tgz파일을 만든후 업로드를 한다.
    1
    예시)
    2
    $ bosh create-release --force --tarball on-demand-release.tgz --name on-demand-release --version 1.0
    3
    $ bosh upload-release on-demand-release.tgz(bosh ur on-demand-release.tgz)
    4
    5
    또는 create.sh파일을 커스텀한후 실행시키면 된다.
    Copied!
4.5. On-Demand Deployment 개발가이드
BOSH Deploymentmanifest 는 components 요소 및 배포의 속성을 정의한YAML 파일이다. Deployment manifest 에는 sotfware를 설치 하기 위해서 어떤 Stemcell (OS, BOSH agent) 을 사용할것이며 Release (Software packages, Config templates, Scripts) 이름과 버전, VMs 용량, Jobs params 등을 정의하여 Bosh deploy CLI 을 이용하여 software(여기서는 서비스팩)를 설치 한다.
  1. 1.
    On-Demand Deployment 기본 구성
    1
    .
    2
    ├── deploy-vsphere.sh bosh deploy 실행파일
    3
    ├── necessary_on_demand_vars.yml manifest.yml에 들어갈 필수 변경 property파일
    4
    ├── paasta_on_demand_service_broker.yml deploy manifest.yml 파일
    5
    └── unnecessary_on_demand_vars.yml manifest.yml에 들어갈 property파일
    Copied!
    deploy-vsphere.sh
    1
    bosh -d on-demand-service-broker deploy paasta_on_demand_service_broker.yml \
    2
    -l necessary_on_demand_vars.yml\
    3
    -l unnecessary_on_demand_vars.yml
    Copied!
    necessary_on_demand_vars.yml : 변경해야 하는 필수 property파일(정확히 기입안할시 deploy에서 error 발생)
    1
    #!/bin/bash
    2
    3
    ---
    4
    ### On-Demand Bosh Deployment Name Setting ###
    5
    deployment_name: on-demand-service-broker #On-Demand Deployment Name
    6
    7
    ### Main Stemcells Setting ###
    8
    stemcell_os: ubuntu-xenial # Deployment Main Stemcell OS
    9
    stemcell_version: latest # Main Stemcell Version
    10
    stemcell_alias: default # Main Stemcell Alias
    11
    12
    ### On-Demand Release Deployment Setting ###
    13
    releases_name : on-demand-redis-release # On-Demand Release Name
    14
    internal_networks_name : default # Some Network From Your 'bosh cloud-config(cc)'
    15
    mariadb_disk_type : 2GB # MariaDB Disk Type 'bosh cloud-config(cc)'
    16
    broker_port : 8080 # On-Demand Broker Server Port
    17
    bosh_client_admin_id: admin # Bosh Client Admin ID
    18
    bosh_client_admin_secret: bosh_clinet_password # Bosh Client Admin Secret 'echo ${BOSH_CLIENT_SECRET}'
    19
    bosh_url: https://xx.xx.xx.xxx # Bosh URL 'bosh env'
    20
    bosh_director_port: 25555 # Bosh API Port
    21
    bosh_oauth_port: 8443 # Bosh Oauth Port
    22
    23
    cloudfoundry_url: xx.xxx.xx.xxx.xip.io # CloudFoundry URL
    24
    cloudfoundry_sslSkipValidation: true # CloudFoundry Login SSL Validation
    25
    cloudfoundry_admin_id: admin # CloudFoundry Admin ID
    26
    cloudfoundry_admin_password: admin # CloudFoundry Admin Password
    27
    28
    ### On-Demand Service Property(Changes are possible) ###
    29
    mariadb_port: 3306 # MariaDB Server Port
    30
    mariadb_user_password: DB_password # MariaDB Root Password
    Copied!
    unnecessary_on_demand_vars.yml : 변경하지 않아도 되는 property파일
    1
    #!/bin/bash
    2
    3
    ---
    4
    service_instance_guid: 54e2de61-de84-4b9c-afc3-88d08aadfcb6
    5
    service_instance_name: redis
    6
    service_instance_bullet_name: Redis Dedicated Server Use
    7
    service_instance_bullet_desc: Redis Service Using a Dedicated Server
    8
    service_instance_plan_guid: 2a26b717-b8b5-489c-8ef1-02bcdc445720
    9
    service_instance_plan_name: dedicated-vm
    10
    service_instance_plan_desc: Redis service to provide a key-value store
    11
    service_instance_org_limitation: -1 # org당 서비스 개수 제한 -1일경우 limit 없음
    12
    service_instance_space_limitation: -1 # space당 서비스 개수 제한 -1일경우 limit 없음
    Copied!
    paasta_on_demand_service_broker.yml : On-demand-Service의 manifest.yml 파일
    1
    ---
    2
    name: "((deployment_name))" #서비스 배포이름(필수) bosh deployments 로 확인 가능한 이름
    3
    4
    stemcells:
    5
    - alias: "((stemcell_alias))"
    6
    os: "((stemcell_os))"
    7
    version: "((stemcell_version))"
    8
    9
    variables:
    10
    - name: redis-password
    11
    type: password
    12
    13
    releases:
    14
    - name: "((releases_name))" # 서비스 릴리즈 이름(필수) bosh releases로 확인 가능
    15
    version: "1.0" # 서비스 릴리즈 버전(필수):latest 시 업로드된 서비스 릴리즈 최신버전
    16
    17
    update:
    18
    canaries: 1 # canary 인스턴스 수(필수)
    19
    canary_watch_time: 5000-120000 # canary 인스턴스가 수행하기 위한 대기 시간(필수)
    20
    update_watch_time: 5000-120000 # non-canary 인스턴스가 수행하기 위한 대기 시간(필수)
    21
    max_in_flight: 1 # non-canary 인스턴스가 병렬로 update 하는 최대 개수(필수)
    22
    serial: false
    23
    24
    instance_groups:
    25
    ########## INFRA ##########
    26
    - name: mariadb
    27
    azs:
    28
    - z5
    29
    instances: 1
    30
    vm_type: medium
    31
    stemcell: "((stemcell_alias))"
    32
    persistent_disk_type: "((mariadb_disk_type))"
    33
    networks:
    34
    - name: "((internal_networks_name))"
    35
    jobs:
    36
    - name: mariadb
    37
    release: "((releases_name))"
    38
    syslog_aggregator: null
    39
    40
    ######## BROKER ########
    41
    42
    - name: paas-ta-on-demand-broker
    43
    azs:
    44
    - z5
    45
    instances: 1
    46
    vm_type: service_medium
    47
    stemcell: "((stemcell_alias))"
    48
    networks:
    49
    - name: "((internal_networks_name))"
    50
    jobs:
    51
    - name: paas-ta-on-demand-broker
    52
    release: "((releases_name))"
    53
    syslog_aggregator: null
    54
    55
    ######### COMMON PROPERTIES ##########
    56
    properties:
    57
    broker:
    58
    server:
    59
    port: "((broker_port))"
    60
    datasource:
    61
    password: "((mariadb_user_password))"
    62
    service_instance:
    63
    guid: "((service_instance_guid))"
    64
    name: "((service_instance_name))"
    65
    bullet:
    66
    name: "((service_instance_bullet_name))"
    67
    desc: "((service_instance_bullet_desc))"
    68
    plan:
    69
    id: "((service_instance_plan_guid))"
    70
    name: "((service_instance_plan_name))"
    71
    desc: "((service_instance_plan_desc))"
    72
    org_limitation: "((service_instance_org_limitation))"
    73
    space_limitation: "((service_instance_space_limitation))"
    74
    bosh:
    75
    client_id: "((bosh_client_admin_id))"
    76
    client_secret: "((bosh_client_admin_secret))"
    77
    url: ((bosh_url)):((bosh_director_port))
    78
    oauth_url: ((bosh_url)):((bosh_oauth_port))
    79
    deployment_name: "((deployment_name))"
    80
    instance_name: "((on_demand_service_instance_name))"
    81
    cloudfoundry:
    82
    url: "((cloudfoundry_url))"
    83
    sslSkipValidation: "((cloudfoundry_sslSkipValidation))"
    84
    admin:
    85
    id: "((cloudfoundry_admin_id))"
    86
    password: "((cloudfoundry_admin_password))"
    87
    mariadb: # MARIA DB SERVER 설정 정보
    88
    port: "((mariadb_port))" # MARIA DB PORT 번호
    89
    admin_user:
    90
    password: "((mariadb_user_password))" # MARIA DB ROOT 계정 비밀번호
    91
    host_names:
    92
    - mariadb0
    Copied!
  2. 2.
    서비스를 추가한 On-Demand-Service 배포하기(On-Demand-Service-Redis) 서비스를 추가한 On-Demand-Service를 배포하기 위해선 서비스에 필요한 프로퍼티 설정 및 manifest.yml에 추가해 deploy를 진행하면 된다.
1
On-Demand-Redis property.yml(예시)
2
```
3
#!/bin/bash
4
5
---
6
### On-Demand Bosh Deployment Name Setting ###
7
deployment_name: on-demand-service-broker #On-Demand Deployment Name
8
9
### Main Stemcells Setting ###
10
stemcell_os: ubuntu-xenial # Deployment Main Stemcell OS
11
stemcell_version: latest # Main Stemcell Version
12
stemcell_alias: default # Main Stemcell Alias
13
14
### On-Demand Release Deployment Setting ###
15
releases_name : on-demand-redis-release # On-Demand Release Name
16
internal_networks_name : default # Some Network From Your 'bosh cloud-config(cc)'
17
mariadb_disk_type : 2GB # MariaDB Disk Type 'bosh cloud-config(cc)'
18
broker_port : 8080 # On-Demand Broker Server Port
19
bosh_client_admin_id: admin # Bosh Client Admin ID
20
bosh_client_admin_secret: bosh_clinet_password # Bosh Client Admin Secret 'echo ${BOSH_CLIENT_SECRET}'
21
bosh_url: https://xx.xx.xx.xxx # Bosh URL 'bosh env'
22
bosh_director_port: 25555 # Bosh API Port
23
bosh_oauth_port: 8443 # Bosh Oauth Port
24
25
cloudfoundry_url: xx.xxx.xx.xxx.xip.io # CloudFoundry URL
26
cloudfoundry_sslSkipValidation: true # CloudFoundry Login SSL Validation
27
cloudfoundry_admin_id: admin # CloudFoundry Admin ID
28
cloudfoundry_admin_password: admin # CloudFoundry Admin Password
29
30
### On-Demand Service Property(Changes are possible) ###
31
mariadb_port: 3306 # MariaDB Server Port
32
mariadb_user_password: DB_password # MariaDB Root Password
33
34
### On-Demand Dedicated Service Instance Properties ### #서비스에 적용시킬 프로퍼티 추가 기입
35
36
on_demand_service_instance_name: redis # On-Demand Service Instance Name
37
service_password: service_password
38
service_port: 6379
39
40
```
41
42
On-Demand-Redis paasta_on_demand_service_broker(예시)
43
```
44
---
45
name: "((deployment_name))" #서비스 배포이름(필수) bosh deployments 로 확인 가능한 이름
46
47
stemcells:
48
- alias: "((stemcell_alias))"
49
os: "((stemcell_os))"
50
version: "((stemcell_version))"
51
52
addons:
53
- name: bpm
54
jobs:
55
- name: bpm
56
release: bpm
57
58
variables:
59
- name: redis-password
60
type: password
61
62
releases:
63
- name: bpm
64
sha1: f2bd126b17b3591160f501d88d79ccf0aba1ae54
65
url: git+https://github.com/cloudfoundry-incubator/bpm-release
66
version: 1.0.3
67
- name: "((releases_name))" # 서비스 릴리즈 이름(필수) bosh releases로 확인 가능
68
version: "1.0" # 서비스 릴리즈 버전(필수):latest 시 업로드된 서비스 릴리즈 최신버전
69
70
update:
71
canaries: 1 # canary 인스턴스 수(필수)
72
canary_watch_time: 5000-120000 # canary 인스턴스가 수행하기 위한 대기 시간(필수)
73
update_watch_time: 5000-120000 # non-canary 인스턴스가 수행하기 위한 대기 시간(필수)
74
max_in_flight: 1 # non-canary 인스턴스가 병렬로 update 하는 최대 개수(필수)
75
serial: false
76
77
instance_groups:
78
########## INFRA ##########
79
- name: mariadb
80
azs:
81
- z5
82
instances: 1
83
vm_type: medium
84
stemcell: "((stemcell_alias))"
85
persistent_disk_type: "((mariadb_disk_type))"
86
networks:
87
- name: "((internal_networks_name))"
88
jobs:
89
- name: mariadb
90
release: "((releases_name))"
91
syslog_aggregator: null
92
93
######## BROKER ########
94
95
- name: paas-ta-on-demand-broker
96
azs:
97
- z5
98
instances: 1
99
vm_type: service_medium
100
stemcell: "((stemcell_alias))"
101
networks:
102
- name: "((internal_networks_name))"
103
jobs:
104
- name: paas-ta-on-demand-broker
105
release: "((releases_name))"
106
syslog_aggregator: null
107
- name: redis
108
azs:
109
- z5
110
instances: 0
111
vm_type: medium
112
stemcell: "((stemcell_alias))"
113
persistent_disk: 1024
114
networks:
115
- name: "((internal_networks_name))"
116
jobs:
117
- name: redis
118
release: "((releases_name))"
119
- name: sanity-tests
120
azs:
121
- z5
122
instances: 1
123
lifecycle: errand
124
vm_type: medium
125
stemcell: "((stemcell_alias))"
126
networks:
127
- name: "((internal_networks_name))"
128
jobs:
129
- name: sanity-tests
130
release: "((releases_name))"
131
132
######### COMMON PROPERTIES ##########
133
properties:
134
broker:
135
server:
136
port: "((broker_port))"
137
datasource:
138
password: "((mariadb_user_password))"
139
service_instance:
140
guid: "((service_instance_guid))"
141
name: "((service_instance_name))"
142
bullet:
143
name: "((service_instance_bullet_name))"
144
desc: "((service_instance_bullet_desc))"
145
plan:
146
id: "((service_instance_plan_guid))"
147
name: "((service_instance_plan_name))"
148
desc: "((service_instance_plan_desc))"
149
org_limitation: "((service_instance_org_limitation))"
150
space_limitation: "((service_instance_space_limitation))"
151
bosh:
152
client_id: "((bosh_client_admin_id))"
153
client_secret: "((bosh_client_admin_secret))"
154
url: ((bosh_url)):((bosh_director_port))
155
oauth_url: ((bosh_url)):((bosh_oauth_port))
156
deployment_name: "((deployment_name))"
157
instance_name: "((on_demand_service_instance_name))"
158
cloudfoundry:
159
url: "((cloudfoundry_url))"
160
sslSkipValidation: "((cloudfoundry_sslSkipValidation))"
161
admin:
162
id: "((cloudfoundry_admin_id))"
163
password: "((cloudfoundry_admin_password))"
164
mariadb: # MARIA DB SERVER 설정 정보
165
port: "((mariadb_port))" # MARIA DB PORT 번호
166
admin_user:
167
password: "((mariadb_user_password))" # MARIA DB ROOT 계정 비밀번호
168
host_names:
169
- mariadb0
170
######### SERVICE PROPERTIES #################
171
service:
172
password: "((service_password))"
173
port: "((service_port))"
174
175
```
Copied!
  1. 1.
    서비스 배포 성공후 브로커 등록 및 서비스 신청시 해당 서비스 instance 생성 확인, 생성 완료시 On-Demand-Service 설치 완료
Last modified 1yr ago