hello!
Nikolay Valchev
Managing Distributed Cloud Native
Applications Made Easy
Spring Music 2.0
Spring Music inspired sample
✘ web – songs and albums
✘ news provider
✘ external news provider
spring-music
Lifecycle
Management
Unit
Version 1.0.0
news
provider
web
DB
service
instance
external news
provider
What are the Challenges?
✘ Develop…
✘ Deployment-specific configuration…
✘ Package and deliver…
✘ Deploy…
✘ Update…
✘ …with no downtime…
✘ Undeploy…
Application
DevOps
Team (~ 2
Pizzas)
Other Service
Business capability
Lifecycle
Management Unit
Version x.y.z
Java
(heavy data
processing)
“BACKEND”
Node.Js
(heavy data
processing)
”FRONTEND”
DB service
instance
“PERSISTE
NCE”
Geo-spatial
Service
“EXTERNAL
RESOURCE“
Multi-Target Application (MTA)
Business capability
Lifecycle
Management Unit
Version x.y.z
Java
(heavy data
processing)
“BACKEND”
Node.Js
(user request
processing)
”FRONTEND”
DB service
instance
“PERSISTEN
CE”
Geo-spatial
service
“EXTERNAL
RESOURCE“
MTA: my-app
Module
type
Resource
type
Module
type
Resource
type
Version x.y.z
MTA Descriptors
✘ YAML files
extends
MTA
deployment
descriptor
MTA
extension
descriptor
*1
extends
MTA Descriptors
✘ YAML files
✘ MTA Deployment Descriptor (mtad.yaml)
extends
MTA
deployment
descriptor
MTA
extension
descriptor
*1
extends
MTA Descriptors
✘ YAML files
✘ MTA Deployment Descriptor (mtad.yaml)
✘ MTA Extension Descriptor (*.mtaext)
extends
MTA
deployment
descriptor
MTA
extension
descriptor
*1
extends
MTA Deployment Descriptor
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
spring-music
Lifecycle
Management
Unit
Version 1.0.0
news
provider
web
DB
service
instance
external
news
provider
MTA Deployment Descriptor
MTA header
✘ spec version
✘ app ID
✘ version
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Modules
✘ name
✘ type
✘ path
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Modules
✘ buildpack
✘ route
✘ other parameters
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Modules
✘ properties/env
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Modules
✘ expose config
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Modules
✘ placeholders like
${default-url}
resolved automatically
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Modules
✘ inject config via
reference notation
like ~{url}
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Resources
✘ name
✘ type
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Resources
✘ service label
✘ plan
✘ other parameters
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Resources
✘ some parameters
unknown on design
time
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Deployment Descriptor
Modules
✘ service bindings
_schema-version: 3
ID: org.cf.samples.spring-music
version: 1.0.0
modules:
- name: spring-music-web
type: java.tomcat
path: build/libs/spring-music.jar
requires:
- name: news-provider
properties:
NEWS_URL: ~{url}
- name: spring-music-db
- name: spring-music-news-external
parameters:
buildpack: java_buildpack
properties:
POPULATE_ALBUM_REPOSITORY: true
- name: spring-music-news
type: javascript.nodejs
path: spring-music-news/
provides:
- name: news-provider
properties:
url: ${default-url}/news
resources:
- name: spring-music-db
type: managed-service
parameters:
service: postgresql
service-plan: v9.4-container
- name: spring-music-news-external
type: user-provided-service
parameters:
config:
url:
MTA Extension Descriptor
Deployment context dependent
Add property values and parameters
_schema-version: 3
ID: cf.samples.spring-music.prod-config
extends: cf.samples.spring.music
modules:
- name: spring-music-web
parameters:
memory: 1G
instances: 2
properties:
POPULATE_ALBUM_REPOSITORY: false
- name: spring-music-news
parameters:
memory: 128M
resources:
- name: spring-music-news-external
parameters:
config:
url: https://news-external.my.domain/news
What is an MTA Archive (MTAR)?
✘ Container, compliant with the
JAR specification
✘ Contains modules…
… a manifest and the MTA
deployment descriptor
✘ Used for distribution of the
packaged app
MTA
deployment
descriptor
Java
WAR
Node.Js
Code
…
...
CF Deploy Service
CF CLI plugin to deploy MTA with
a single operation
MTA
deployment
descriptor
MTA archive
module
MTA
extension
descriptor
CF CLI
operator
Cloud Foundry
Cloud
Controller
CF Deploy Service
PostgreSQL
database
target
state
workflows
cf deploy
current
state
CF Deploy Service
MTA
deployment
descriptor
MTA archive
module
MTA
extension
descriptor
CF CLI
operator
Cloud Foundry
Cloud
Controller
CF Deploy Service
PostgreSQL
database
target
state
workflows
cf deploy
current
state
”Server” app with the goal to
bring the app to desired state
Demo
Supported Operations
✘ Deploy (incl. from Git, in future from directory)
✘ Update (incremental)
✘ Blue-green deploy
✘ Cross-MTA configuration
Enterprise Qualities
✘ Deterministic deployment order and timing
✘ Recoverability of a multi-step operation
✘ Logging and auditability
✘ Version evolution policies
✘ Deletion of non-relevant artifacts
>1000Deploys per day
>100Real apps
>1500Distinct MTAs (incl. test ones)
@ SAP Cloud Platform
It is Open Source
Open Source Availability
MTA model guide
MTA parsers, validators, persistence and utilities
CF MTA plugin
CF MTA deploy service
Spring Music MTA
Outlook
Evaluation from CF Controller API team – Pivotal tracker item [done]
Proposal for incubation in CF Extensions [pending]
Outlook
Evaluation from CF Controller API team – Pivotal tracker item [done]
Proposal for incubation in CF Extensions [pending]
Planed features:
✘ Parallel materialization of artifacts
✘ Rolling updates
✘ Version rollbacks
✘ Application configuration update
✘ Docker support
✘ Lifecycle hooks
✘ Secure configuration management
thanks!
Any questions?
You can find me at
nikolay.valchev@sap.com
nvvalchev@gmail.com
Credits
Special thanks to all the people who made and released
these awesome resources for free:
✘ Presentation template by SlidesCarnival
✘ Photographs by Unsplash
SlidesCarnival icons are editable shapes.
This means that you can:
● Resize them without losing quality.
● Change fill color and opacity.
Isn’t that nice? :)
Examples:
Extra graphics

Managing distributed-cloud-apps

  • 1.
  • 2.
    Managing Distributed CloudNative Applications Made Easy
  • 3.
    Spring Music 2.0 SpringMusic inspired sample ✘ web – songs and albums ✘ news provider ✘ external news provider spring-music Lifecycle Management Unit Version 1.0.0 news provider web DB service instance external news provider
  • 4.
    What are theChallenges? ✘ Develop… ✘ Deployment-specific configuration… ✘ Package and deliver… ✘ Deploy… ✘ Update… ✘ …with no downtime… ✘ Undeploy… Application DevOps Team (~ 2 Pizzas) Other Service Business capability Lifecycle Management Unit Version x.y.z Java (heavy data processing) “BACKEND” Node.Js (heavy data processing) ”FRONTEND” DB service instance “PERSISTE NCE” Geo-spatial Service “EXTERNAL RESOURCE“
  • 5.
    Multi-Target Application (MTA) Businesscapability Lifecycle Management Unit Version x.y.z Java (heavy data processing) “BACKEND” Node.Js (user request processing) ”FRONTEND” DB service instance “PERSISTEN CE” Geo-spatial service “EXTERNAL RESOURCE“ MTA: my-app Module type Resource type Module type Resource type Version x.y.z
  • 6.
    MTA Descriptors ✘ YAMLfiles extends MTA deployment descriptor MTA extension descriptor *1 extends
  • 7.
    MTA Descriptors ✘ YAMLfiles ✘ MTA Deployment Descriptor (mtad.yaml) extends MTA deployment descriptor MTA extension descriptor *1 extends
  • 8.
    MTA Descriptors ✘ YAMLfiles ✘ MTA Deployment Descriptor (mtad.yaml) ✘ MTA Extension Descriptor (*.mtaext) extends MTA deployment descriptor MTA extension descriptor *1 extends
  • 9.
    MTA Deployment Descriptor _schema-version:3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url: spring-music Lifecycle Management Unit Version 1.0.0 news provider web DB service instance external news provider
  • 10.
    MTA Deployment Descriptor MTAheader ✘ spec version ✘ app ID ✘ version _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 11.
    MTA Deployment Descriptor Modules ✘name ✘ type ✘ path _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 12.
    MTA Deployment Descriptor Modules ✘buildpack ✘ route ✘ other parameters _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 13.
    MTA Deployment Descriptor Modules ✘properties/env _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 14.
    MTA Deployment Descriptor Modules ✘expose config _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 15.
    MTA Deployment Descriptor Modules ✘placeholders like ${default-url} resolved automatically _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 16.
    MTA Deployment Descriptor Modules ✘inject config via reference notation like ~{url} _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 17.
    MTA Deployment Descriptor Resources ✘name ✘ type _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 18.
    MTA Deployment Descriptor Resources ✘service label ✘ plan ✘ other parameters _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 19.
    MTA Deployment Descriptor Resources ✘some parameters unknown on design time _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 20.
    MTA Deployment Descriptor Modules ✘service bindings _schema-version: 3 ID: org.cf.samples.spring-music version: 1.0.0 modules: - name: spring-music-web type: java.tomcat path: build/libs/spring-music.jar requires: - name: news-provider properties: NEWS_URL: ~{url} - name: spring-music-db - name: spring-music-news-external parameters: buildpack: java_buildpack properties: POPULATE_ALBUM_REPOSITORY: true - name: spring-music-news type: javascript.nodejs path: spring-music-news/ provides: - name: news-provider properties: url: ${default-url}/news resources: - name: spring-music-db type: managed-service parameters: service: postgresql service-plan: v9.4-container - name: spring-music-news-external type: user-provided-service parameters: config: url:
  • 21.
    MTA Extension Descriptor Deploymentcontext dependent Add property values and parameters _schema-version: 3 ID: cf.samples.spring-music.prod-config extends: cf.samples.spring.music modules: - name: spring-music-web parameters: memory: 1G instances: 2 properties: POPULATE_ALBUM_REPOSITORY: false - name: spring-music-news parameters: memory: 128M resources: - name: spring-music-news-external parameters: config: url: https://news-external.my.domain/news
  • 22.
    What is anMTA Archive (MTAR)? ✘ Container, compliant with the JAR specification ✘ Contains modules… … a manifest and the MTA deployment descriptor ✘ Used for distribution of the packaged app MTA deployment descriptor Java WAR Node.Js Code … ...
  • 23.
    CF Deploy Service CFCLI plugin to deploy MTA with a single operation MTA deployment descriptor MTA archive module MTA extension descriptor CF CLI operator Cloud Foundry Cloud Controller CF Deploy Service PostgreSQL database target state workflows cf deploy current state
  • 24.
    CF Deploy Service MTA deployment descriptor MTAarchive module MTA extension descriptor CF CLI operator Cloud Foundry Cloud Controller CF Deploy Service PostgreSQL database target state workflows cf deploy current state ”Server” app with the goal to bring the app to desired state
  • 25.
  • 26.
    Supported Operations ✘ Deploy(incl. from Git, in future from directory) ✘ Update (incremental) ✘ Blue-green deploy ✘ Cross-MTA configuration
  • 27.
    Enterprise Qualities ✘ Deterministicdeployment order and timing ✘ Recoverability of a multi-step operation ✘ Logging and auditability ✘ Version evolution policies ✘ Deletion of non-relevant artifacts
  • 28.
    >1000Deploys per day >100Realapps >1500Distinct MTAs (incl. test ones) @ SAP Cloud Platform
  • 29.
    It is OpenSource
  • 30.
    Open Source Availability MTAmodel guide MTA parsers, validators, persistence and utilities CF MTA plugin CF MTA deploy service Spring Music MTA
  • 31.
    Outlook Evaluation from CFController API team – Pivotal tracker item [done] Proposal for incubation in CF Extensions [pending]
  • 32.
    Outlook Evaluation from CFController API team – Pivotal tracker item [done] Proposal for incubation in CF Extensions [pending] Planed features: ✘ Parallel materialization of artifacts ✘ Rolling updates ✘ Version rollbacks ✘ Application configuration update ✘ Docker support ✘ Lifecycle hooks ✘ Secure configuration management
  • 33.
    thanks! Any questions? You canfind me at nikolay.valchev@sap.com nvvalchev@gmail.com
  • 34.
    Credits Special thanks toall the people who made and released these awesome resources for free: ✘ Presentation template by SlidesCarnival ✘ Photographs by Unsplash
  • 35.
    SlidesCarnival icons areeditable shapes. This means that you can: ● Resize them without losing quality. ● Change fill color and opacity. Isn’t that nice? :) Examples:
  • 36.

Editor's Notes

  • #5 CF-apps which constitute a larger application might even not qualify for being micro-services. Although pushed to an individual container, they might lack the essential micro-services characteristics of being independently deployable units. This happens if they don't expose stable API contracts. Sometimes, it is just not worth the effort to create such contracts because the individual CF-apps might not be created as a result of a domain-driven design approach, but simply for enabling independent scaling of application parts. Another common pattern is to break down the application into a UI-part (also acting as the initial user request processing stage) and a backend-part, each implemented with adequate technologies (e.g. node.js vs. Java). Both parts will be tightly coupled as new backend features need to be reflected on the UI, and a pure compatible evolution of backend APIs is realistically impossible, especially for immature products. Further, application private service instances logically are constituents of the application which needs to be considered during initial deployment, updates and deletions.
  • #6 Definition: A multi-target application (MTA) is comprised of multiple software pieces (“modules”) which all share a common lifecycle for development and deployment. These modules can be written in different technologies and deployed to different targets respectively – but they all serve (different aspects of) a particular purpose for the application users.
  • #10 Describe the structure of the app
  • #24 Deploy with a single operation, which also includes validating the completeness and consistency of an MTA on this platform. Workflow-based Java server application Automating the lifecycle operations of MTA apps in CF Analyses the MTA archive and MTA ext. descriptor to build desired platform model Materialize this desired platform model Integrated in the CF and XSA CLI clients via plugins
  • #25 Deploy with a single operation, which also includes validating the completeness and consistency of an MTA on this platform. Workflow-based Java server application Automating the lifecycle operations of MTA apps in CF Analyses the MTA archive and MTA ext. descriptor to build desired platform model Materialize this desired platform model Integrated in the CF and XSA CLI clients via plugins
  • #27 Deploy with a single operation, which also includes validating the completeness and consistency
  • #28 Deterministic deployment order and timing Recoverability - resume deployment from the point of failure of a multi-step operation Logging and auditability of the entire application lifecycle Implement version evolution policies Deletion of non-relevant technical artifacts
  • #32 Proposal for incubation in CF Foundation Establish the standard for CF packaged apps for CF certified platforms Standardize CF packaged apps lifecycle management
  • #33 We are working on more lifecycle automation aspects based on the declarative application model. This list is not complete but should show you our intended direction.