├── .gitignore
├── .jdk8
├── .mvn
├── jvm.config
├── maven.config
└── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── .settings.xml
├── .travis.yml
├── CODE_OF_CONDUCT.adoc
├── LICENSE
├── NOTICE
├── README.adoc
├── mvnw
├── mvnw.cmd
├── pom.xml
├── spring-cloud-dataflow-server-cloudfoundry-autoconfig
├── .jdk8
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── org
│ │ └── springframework
│ │ └── cloud
│ │ └── dataflow
│ │ └── server
│ │ └── cloudfoundry
│ │ └── config
│ │ ├── CloudFoundryDataFlowServerConfiguration.java
│ │ ├── CloudFoundrySchedulerConfiguration.java
│ │ ├── CloudFoundryServerConfigurationProperties.java
│ │ ├── DataSourceCloudConfig.java
│ │ ├── TaskFeatureAutoToggleEnvironmentPostProcessor.java
│ │ └── security
│ │ ├── CloudFoundryOAuthSecurityConfiguration.java
│ │ └── support
│ │ ├── AccessLevel.java
│ │ ├── CloudFoundryAuthorizationException.java
│ │ ├── CloudFoundryDataflowAuthoritiesExtractor.java
│ │ ├── CloudFoundryPrincipalExtractor.java
│ │ └── CloudFoundrySecurityService.java
│ └── resources
│ └── META-INF
│ └── spring.factories
├── spring-cloud-dataflow-server-cloudfoundry-docs
├── .jdk8
├── pom.xml
└── src
│ └── main
│ ├── asciidoc
│ ├── Guardfile
│ ├── api-guide-link.adoc
│ ├── appendix.adoc
│ ├── building.adoc
│ ├── cf-tasks.adoc
│ ├── configuration.adoc
│ ├── docinfo.html
│ ├── getting-started.adoc
│ ├── images
│ │ ├── PLACE_IMAGES_HERE
│ │ └── cf-getting-started-security-no-roles.png
│ ├── index-docinfo.xml
│ ├── index.adoc
│ └── overview.adoc
│ ├── docbook
│ ├── css
│ │ ├── highlight.css
│ │ ├── manual-multipage.css
│ │ ├── manual-singlepage.css
│ │ └── manual.css
│ ├── images
│ │ ├── background.png
│ │ ├── caution.png
│ │ ├── cover.png
│ │ ├── important.png
│ │ ├── logo.png
│ │ ├── logo.svg
│ │ ├── note.png
│ │ ├── tip.png
│ │ └── warning.png
│ └── xsl
│ │ ├── common.xsl
│ │ ├── epub.xsl
│ │ ├── html-multipage.xsl
│ │ ├── html-singlepage.xsl
│ │ ├── html.xsl
│ │ ├── pdf.xsl
│ │ ├── xslthl-config.xml
│ │ └── xslthl
│ │ ├── asciidoc-hl.xml
│ │ ├── bourne-hl.xml
│ │ ├── c-hl.xml
│ │ ├── cpp-hl.xml
│ │ ├── csharp-hl.xml
│ │ ├── css-hl.xml
│ │ ├── html-hl.xml
│ │ ├── ini-hl.xml
│ │ ├── java-hl.xml
│ │ ├── javascript-hl.xml
│ │ ├── json-hl.xml
│ │ ├── perl-hl.xml
│ │ ├── php-hl.xml
│ │ ├── properties-hl.xml
│ │ ├── python-hl.xml
│ │ ├── ruby-hl.xml
│ │ ├── sql2003-hl.xml
│ │ └── yaml-hl.xml
│ └── javadoc
│ └── spring-javadoc.css
├── spring-cloud-dataflow-server-cloudfoundry
├── .jdk8
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── org
│ │ │ └── springframework
│ │ │ └── cloud
│ │ │ └── dataflow
│ │ │ └── server
│ │ │ └── cloudfoundry
│ │ │ └── CloudFoundryDataFlowServer.java
│ └── resources
│ │ └── dataflow-server.yml
│ └── test
│ └── java
│ └── org
│ └── springframework
│ └── cloud
│ └── dataflow
│ └── server
│ └── cloudfoundry
│ └── CloudFoundryDataFlowServerApplicationTests.java
└── src
├── checkstyle
├── checkstyle-header.txt
└── checkstyle.xml
└── eclipse
├── eclipse-code-formatter.xml
└── eclipse.importorder
/.gitignore:
--------------------------------------------------------------------------------
1 | *~
2 | .#*
3 | *#
4 | *.sw*
5 | _site/
6 | .factorypath
7 | .gradletasknamecache
8 | .DS_Store
9 | /application.yml
10 | /application.properties
11 | asciidoctor.css
12 | atlassian-ide-plugin.xml
13 | bin/
14 | build/
15 | dump.rdb
16 | out
17 | spring-shell.log
18 | target/
19 | test-output
20 |
21 | # Eclipse artifacts, including WTP generated manifests
22 | .classpath
23 | .project
24 | .settings/
25 | .springBeans
26 | spring-*/src/main/java/META-INF/MANIFEST.MF
27 |
28 | # IDEA artifacts and output dirs
29 | *.iml
30 | *.ipr
31 | *.iws
32 | .idea/*
33 | manifest.yml
34 |
--------------------------------------------------------------------------------
/.jdk8:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/.jdk8
--------------------------------------------------------------------------------
/.mvn/jvm.config:
--------------------------------------------------------------------------------
1 | -Xmx1024m -XX:CICompilerCount=1 -XX:TieredStopAtLevel=1 -Djava.security.egd=file:/dev/./urandom
--------------------------------------------------------------------------------
/.mvn/maven.config:
--------------------------------------------------------------------------------
1 | -DaltSnapshotDeploymentRepository=repo.spring.io::default::https://repo.spring.io/libs-snapshot-local -P spring
2 |
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip
2 |
--------------------------------------------------------------------------------
/.settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | repo.spring.io
6 | ${env.CI_DEPLOY_USERNAME}
7 | ${env.CI_DEPLOY_PASSWORD}
8 |
9 |
10 |
11 |
12 |
18 | spring
19 | true
20 |
21 |
22 | spring-snapshots
23 | Spring Snapshots
24 | http://repo.spring.io/libs-snapshot-local
25 |
26 | true
27 |
28 |
29 |
30 | spring-milestones
31 | Spring Milestones
32 | http://repo.spring.io/libs-milestone-local
33 |
34 | false
35 |
36 |
37 |
38 | spring-releases
39 | Spring Releases
40 | http://repo.spring.io/release
41 |
42 | false
43 |
44 |
45 |
46 |
47 |
48 | spring-snapshots
49 | Spring Snapshots
50 | http://repo.spring.io/libs-snapshot-local
51 |
52 | true
53 |
54 |
55 |
56 | spring-milestones
57 | Spring Milestones
58 | http://repo.spring.io/libs-milestone-local
59 |
60 | false
61 |
62 |
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: false
2 | cache:
3 | directories:
4 | - $HOME/.m2
5 | language: java
6 | jdk:
7 | - oraclejdk8
8 | services:
9 | - redis-server
10 | install: true
11 | script:
12 | - '[ "${TRAVIS_PULL_REQUEST}" != "false" ] || ./mvnw package -Pfull -U -Dmaven.test.redirectTestOutputToFile=false'
13 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.adoc:
--------------------------------------------------------------------------------
1 | = Contributor Code of Conduct
2 |
3 | As contributors and maintainers of this project, and in the interest of fostering an open
4 | and welcoming community, we pledge to respect all people who contribute through reporting
5 | issues, posting feature requests, updating documentation, submitting pull requests or
6 | patches, and other activities.
7 |
8 | We are committed to making participation in this project a harassment-free experience for
9 | everyone, regardless of level of experience, gender, gender identity and expression,
10 | sexual orientation, disability, personal appearance, body size, race, ethnicity, age,
11 | religion, or nationality.
12 |
13 | Examples of unacceptable behavior by participants include:
14 |
15 | * The use of sexualized language or imagery
16 | * Personal attacks
17 | * Trolling or insulting/derogatory comments
18 | * Public or private harassment
19 | * Publishing other's private information, such as physical or electronic addresses,
20 | without explicit permission
21 | * Other unethical or unprofessional conduct
22 |
23 | Project maintainers have the right and responsibility to remove, edit, or reject comments,
24 | commits, code, wiki edits, issues, and other contributions that are not aligned to this
25 | Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors
26 | that they deem inappropriate, threatening, offensive, or harmful.
27 |
28 | By adopting this Code of Conduct, project maintainers commit themselves to fairly and
29 | consistently applying these principles to every aspect of managing this project. Project
30 | maintainers who do not follow or enforce the Code of Conduct may be permanently removed
31 | from the project team.
32 |
33 | This Code of Conduct applies both within project spaces and in public spaces when an
34 | individual is representing the project or its community.
35 |
36 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by
37 | contacting a project maintainer at spring-code-of-conduct@pivotal.io . All complaints will
38 | be reviewed and investigated and will result in a response that is deemed necessary and
39 | appropriate to the circumstances. Maintainers are obligated to maintain confidentiality
40 | with regard to the reporter of an incident.
41 |
42 | This Code of Conduct is adapted from the
43 | http://contributor-covenant.org[Contributor Covenant], version 1.3.0, available at
44 | http://contributor-covenant.org/version/1/3/0/[contributor-covenant.org/version/1/3/0/]
45 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
203 |
--------------------------------------------------------------------------------
/NOTICE:
--------------------------------------------------------------------------------
1 | spring-cloud-dataflow-server-cloudfoundry
2 |
3 | Copyright (c) 2016-Present Pivotal Software, Inc. All Rights Reserved.
4 |
5 | Licensed under the Apache License, Version 2.0 (the "License");
6 | you may not use this file except in compliance with the License.
7 | You may obtain a copy of the License at
8 |
9 | http://www.apache.org/licenses/LICENSE-2.0
10 |
11 | Unless required by applicable law or agreed to in writing, software
12 | distributed under the License is distributed on an "AS IS" BASIS,
13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | See the License for the specific language governing permissions and
15 | limitations under the License.
--------------------------------------------------------------------------------
/README.adoc:
--------------------------------------------------------------------------------
1 | # spring-cloud-dataflow-server-cloudfoundry is no longer actively maintained by VMware, Inc.
2 |
3 | = Spring Cloud Data Flow Server for Cloud Foundry image:https://build.spring.io/plugins/servlet/wittified/build-status/SCD-CFBMASTER[Build Status, link=https://build.spring.io/browse/SCD-CFBMASTER] image:https://badge.waffle.io/spring-cloud/spring-cloud-dataflow-server-cloudfoundry.svg?label=ready&title=Ready[Stories in Ready, link=http://waffle.io/spring-cloud/spring-cloud-dataflow-server-cloudfoundry] image:https://badge.waffle.io/spring-cloud/spring-cloud-dataflow-server-cloudfoundry.svg?label=In%20Progress&title=In%20Progress[Stories in Progress, link=http://waffle.io/spring-cloud/spring-cloud-dataflow-server-cloudfoundry]
4 |
5 | This project provides support for deploying https://github.com/spring-cloud/spring-cloud-dataflow[Spring Cloud Data Flow]'s streaming and batch data pipelines to Cloud Foundry. It includes an implementation of Spring Cloud Data Flow's https://github.com/spring-cloud/spring-cloud-deployer[Deployer SPI] for Cloud Foundry.
6 |
7 | Please refer to the http://docs.spring.io/spring-cloud-dataflow-server-cloudfoundry/docs/current-SNAPSHOT/reference/htmlsingle/#index[reference documentation] on how to get started.
8 |
9 | === NOTE: Spring Cloud Data Flow v2.0
10 |
11 | Beginning with Spring Cloud Data Flow v2.0.0, we have consolidated the Local, Cloud Foundry, and Kubernetes servers into a single server. Instead of building, maintaining, and shipping individual server-implementations, we have consolidated them into a single server, and all the supported https://github.com/spring-cloud/spring-cloud-dataflow#components[platform-specific deployer implementation] libraries are bundled in it.
12 |
13 | That would mean, as a user, you don't need to pick different JARs or Docker-images depending on what platform you want to run.
14 |
15 | The other notable benefit to this approach is the ability to configure the single-server with multiple platform backends. The same server can be configured against Local, "n" number of Cloud Foundry `org/space` combinations, and as well against "n" number of Kubernetes clusters and the associated `namespace`. At the time of stream-deployment or task-launches, you would be able to pick-and-choose the platform where you want to orchestrate the deployment. It would further simplify and promote CI/CD practices for data pipelines.
16 |
17 | The http://docs.spring.io/spring-cloud-dataflow/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started[getting-started] steps for each platform remains mostly the same. One significant change is how Tasks are configured, as we are opening up the capability for Tasks to be launched across different platforms as well.
18 |
19 | In summary, please DO NOT use the `master` branch of this repository; switch over to https://github.com/spring-cloud/spring-cloud-dataflow[Spring Cloud Data Flow] v2.0 instead. We intend to continue to support the Spring Cloud Data Flow's v1.x branch of CloudFoundry-server for a period of at least a year from the general availability of v2.0 GA release.
20 |
21 | === Contributing
22 |
23 | We love contributions. Follow this https://github.com/spring-cloud/spring-cloud-dataflow/blob/master/spring-cloud-dataflow-docs/src/main/asciidoc/appendix-contributing.adoc[link] for more information on how to contribute.
24 |
25 | === Building
26 |
27 | Clone the repo and type
28 |
29 | ----
30 | $ ./mvnw clean install
31 | ----
32 |
33 | For more information on building, see this https://github.com/spring-cloud/spring-cloud-dataflow/blob/master/spring-cloud-dataflow-docs/src/main/asciidoc/appendix-building.adoc[link].
34 |
35 |
36 |
--------------------------------------------------------------------------------
/mvnw:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # ----------------------------------------------------------------------------
3 | # Licensed to the Apache Software Foundation (ASF) under one
4 | # or more contributor license agreements. See the NOTICE file
5 | # distributed with this work for additional information
6 | # regarding copyright ownership. The ASF licenses this file
7 | # to you under the Apache License, Version 2.0 (the
8 | # "License"); you may not use this file except in compliance
9 | # with the License. You may obtain a copy of the License at
10 | #
11 | # http://www.apache.org/licenses/LICENSE-2.0
12 | #
13 | # Unless required by applicable law or agreed to in writing,
14 | # software distributed under the License is distributed on an
15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 | # KIND, either express or implied. See the License for the
17 | # specific language governing permissions and limitations
18 | # under the License.
19 | # ----------------------------------------------------------------------------
20 |
21 | # ----------------------------------------------------------------------------
22 | # Maven2 Start Up Batch script
23 | #
24 | # Required ENV vars:
25 | # ------------------
26 | # JAVA_HOME - location of a JDK home dir
27 | #
28 | # Optional ENV vars
29 | # -----------------
30 | # M2_HOME - location of maven2's installed home dir
31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven
32 | # e.g. to debug Maven itself, use
33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35 | # ----------------------------------------------------------------------------
36 |
37 | if [ -z "$MAVEN_SKIP_RC" ] ; then
38 |
39 | if [ -f /etc/mavenrc ] ; then
40 | . /etc/mavenrc
41 | fi
42 |
43 | if [ -f "$HOME/.mavenrc" ] ; then
44 | . "$HOME/.mavenrc"
45 | fi
46 |
47 | fi
48 |
49 | # OS specific support. $var _must_ be set to either true or false.
50 | cygwin=false;
51 | darwin=false;
52 | mingw=false
53 | case "`uname`" in
54 | CYGWIN*) cygwin=true ;;
55 | MINGW*) mingw=true;;
56 | Darwin*) darwin=true
57 | #
58 | # Look for the Apple JDKs first to preserve the existing behaviour, and then look
59 | # for the new JDKs provided by Oracle.
60 | #
61 | if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then
62 | #
63 | # Apple JDKs
64 | #
65 | export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
66 | fi
67 |
68 | if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then
69 | #
70 | # Apple JDKs
71 | #
72 | export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
73 | fi
74 |
75 | if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then
76 | #
77 | # Oracle JDKs
78 | #
79 | export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
80 | fi
81 |
82 | if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then
83 | #
84 | # Apple JDKs
85 | #
86 | export JAVA_HOME=`/usr/libexec/java_home`
87 | fi
88 | ;;
89 | esac
90 |
91 | if [ -z "$JAVA_HOME" ] ; then
92 | if [ -r /etc/gentoo-release ] ; then
93 | JAVA_HOME=`java-config --jre-home`
94 | fi
95 | fi
96 |
97 | if [ -z "$M2_HOME" ] ; then
98 | ## resolve links - $0 may be a link to maven's home
99 | PRG="$0"
100 |
101 | # need this for relative symlinks
102 | while [ -h "$PRG" ] ; do
103 | ls=`ls -ld "$PRG"`
104 | link=`expr "$ls" : '.*-> \(.*\)$'`
105 | if expr "$link" : '/.*' > /dev/null; then
106 | PRG="$link"
107 | else
108 | PRG="`dirname "$PRG"`/$link"
109 | fi
110 | done
111 |
112 | saveddir=`pwd`
113 |
114 | M2_HOME=`dirname "$PRG"`/..
115 |
116 | # make it fully qualified
117 | M2_HOME=`cd "$M2_HOME" && pwd`
118 |
119 | cd "$saveddir"
120 | # echo Using m2 at $M2_HOME
121 | fi
122 |
123 | # For Cygwin, ensure paths are in UNIX format before anything is touched
124 | if $cygwin ; then
125 | [ -n "$M2_HOME" ] &&
126 | M2_HOME=`cygpath --unix "$M2_HOME"`
127 | [ -n "$JAVA_HOME" ] &&
128 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
129 | [ -n "$CLASSPATH" ] &&
130 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
131 | fi
132 |
133 | # For Migwn, ensure paths are in UNIX format before anything is touched
134 | if $mingw ; then
135 | [ -n "$M2_HOME" ] &&
136 | M2_HOME="`(cd "$M2_HOME"; pwd)`"
137 | [ -n "$JAVA_HOME" ] &&
138 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
139 | # TODO classpath?
140 | fi
141 |
142 | if [ -z "$JAVA_HOME" ]; then
143 | javaExecutable="`which javac`"
144 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
145 | # readlink(1) is not available as standard on Solaris 10.
146 | readLink=`which readlink`
147 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
148 | if $darwin ; then
149 | javaHome="`dirname \"$javaExecutable\"`"
150 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
151 | else
152 | javaExecutable="`readlink -f \"$javaExecutable\"`"
153 | fi
154 | javaHome="`dirname \"$javaExecutable\"`"
155 | javaHome=`expr "$javaHome" : '\(.*\)/bin'`
156 | JAVA_HOME="$javaHome"
157 | export JAVA_HOME
158 | fi
159 | fi
160 | fi
161 |
162 | if [ -z "$JAVACMD" ] ; then
163 | if [ -n "$JAVA_HOME" ] ; then
164 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
165 | # IBM's JDK on AIX uses strange locations for the executables
166 | JAVACMD="$JAVA_HOME/jre/sh/java"
167 | else
168 | JAVACMD="$JAVA_HOME/bin/java"
169 | fi
170 | else
171 | JAVACMD="`which java`"
172 | fi
173 | fi
174 |
175 | if [ ! -x "$JAVACMD" ] ; then
176 | echo "Error: JAVA_HOME is not defined correctly." >&2
177 | echo " We cannot execute $JAVACMD" >&2
178 | exit 1
179 | fi
180 |
181 | if [ -z "$JAVA_HOME" ] ; then
182 | echo "Warning: JAVA_HOME environment variable is not set."
183 | fi
184 |
185 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
186 |
187 | # For Cygwin, switch paths to Windows format before running java
188 | if $cygwin; then
189 | [ -n "$M2_HOME" ] &&
190 | M2_HOME=`cygpath --path --windows "$M2_HOME"`
191 | [ -n "$JAVA_HOME" ] &&
192 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
193 | [ -n "$CLASSPATH" ] &&
194 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
195 | fi
196 |
197 | # traverses directory structure from process work directory to filesystem root
198 | # first directory with .mvn subdirectory is considered project base directory
199 | find_maven_basedir() {
200 | local basedir=$(pwd)
201 | local wdir=$(pwd)
202 | while [ "$wdir" != '/' ] ; do
203 | if [ -d "$wdir"/.mvn ] ; then
204 | basedir=$wdir
205 | break
206 | fi
207 | wdir=$(cd "$wdir/.."; pwd)
208 | done
209 | echo "${basedir}"
210 | }
211 |
212 | # concatenates all lines of a file
213 | concat_lines() {
214 | if [ -f "$1" ]; then
215 | echo "$(tr -s '\n' ' ' < "$1")"
216 | fi
217 | }
218 |
219 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
220 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
221 |
222 | # Provide a "standardized" way to retrieve the CLI args that will
223 | # work with both Windows and non-Windows executions.
224 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
225 | export MAVEN_CMD_LINE_ARGS
226 |
227 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
228 |
229 | exec "$JAVACMD" \
230 | $MAVEN_OPTS \
231 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
232 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
233 | ${WRAPPER_LAUNCHER} "$@"
234 |
235 |
--------------------------------------------------------------------------------
/mvnw.cmd:
--------------------------------------------------------------------------------
1 | @REM ----------------------------------------------------------------------------
2 | @REM Licensed to the Apache Software Foundation (ASF) under one
3 | @REM or more contributor license agreements. See the NOTICE file
4 | @REM distributed with this work for additional information
5 | @REM regarding copyright ownership. The ASF licenses this file
6 | @REM to you under the Apache License, Version 2.0 (the
7 | @REM "License"); you may not use this file except in compliance
8 | @REM with the License. You may obtain a copy of the License at
9 | @REM
10 | @REM http://www.apache.org/licenses/LICENSE-2.0
11 | @REM
12 | @REM Unless required by applicable law or agreed to in writing,
13 | @REM software distributed under the License is distributed on an
14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | @REM KIND, either express or implied. See the License for the
16 | @REM specific language governing permissions and limitations
17 | @REM under the License.
18 | @REM ----------------------------------------------------------------------------
19 |
20 | @REM ----------------------------------------------------------------------------
21 | @REM Maven2 Start Up Batch script
22 | @REM
23 | @REM Required ENV vars:
24 | @REM JAVA_HOME - location of a JDK home dir
25 | @REM
26 | @REM Optional ENV vars
27 | @REM M2_HOME - location of maven2's installed home dir
28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 | @REM e.g. to debug Maven itself, use
32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34 | @REM ----------------------------------------------------------------------------
35 |
36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37 | @echo off
38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
40 |
41 | @REM set %HOME% to equivalent of $HOME
42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
43 |
44 | @REM Execute a user defined script before this one
45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending
47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
49 | :skipRcPre
50 |
51 | @setlocal
52 |
53 | set ERROR_CODE=0
54 |
55 | @REM To isolate internal variables from possible post scripts, we use another setlocal
56 | @setlocal
57 |
58 | @REM ==== START VALIDATION ====
59 | if not "%JAVA_HOME%" == "" goto OkJHome
60 |
61 | echo.
62 | echo Error: JAVA_HOME not found in your environment. >&2
63 | echo Please set the JAVA_HOME variable in your environment to match the >&2
64 | echo location of your Java installation. >&2
65 | echo.
66 | goto error
67 |
68 | :OkJHome
69 | if exist "%JAVA_HOME%\bin\java.exe" goto init
70 |
71 | echo.
72 | echo Error: JAVA_HOME is set to an invalid directory. >&2
73 | echo JAVA_HOME = "%JAVA_HOME%" >&2
74 | echo Please set the JAVA_HOME variable in your environment to match the >&2
75 | echo location of your Java installation. >&2
76 | echo.
77 | goto error
78 |
79 | @REM ==== END VALIDATION ====
80 |
81 | :init
82 |
83 | set MAVEN_CMD_LINE_ARGS=%*
84 |
85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86 | @REM Fallback to current working directory if not found.
87 |
88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90 |
91 | set EXEC_DIR=%CD%
92 | set WDIR=%EXEC_DIR%
93 | :findBaseDir
94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound
95 | cd ..
96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound
97 | set WDIR=%CD%
98 | goto findBaseDir
99 |
100 | :baseDirFound
101 | set MAVEN_PROJECTBASEDIR=%WDIR%
102 | cd "%EXEC_DIR%"
103 | goto endDetectBaseDir
104 |
105 | :baseDirNotFound
106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107 | cd "%EXEC_DIR%"
108 |
109 | :endDetectBaseDir
110 |
111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112 |
113 | @setlocal EnableExtensions EnableDelayedExpansion
114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116 |
117 | :endReadAdditionalConfig
118 |
119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120 |
121 | set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar""
122 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
123 |
124 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
125 | if ERRORLEVEL 1 goto error
126 | goto end
127 |
128 | :error
129 | set ERROR_CODE=1
130 |
131 | :end
132 | @endlocal & set ERROR_CODE=%ERROR_CODE%
133 |
134 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
135 | @REM check for post script, once with legacy .bat ending and once with .cmd ending
136 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
137 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
138 | :skipRcPost
139 |
140 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
141 | if "%MAVEN_BATCH_PAUSE%" == "on" pause
142 |
143 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
144 |
145 | exit /B %ERROR_CODE%
146 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4.0.0
4 | spring-cloud-dataflow-server-cloudfoundry-parent
5 | 2.0.0.BUILD-SNAPSHOT
6 | pom
7 |
8 |
9 | org.springframework.cloud
10 | spring-cloud-dataflow-parent
11 | 2.0.0.BUILD-SNAPSHOT
12 |
13 |
14 |
15 |
16 | 2.0.0.BUILD-SNAPSHOT
17 | 2.0.0.BUILD-SNAPSHOT
18 | 2.0.0.BUILD-SNAPSHOT
19 | 1.1.0.BUILD-SNAPSHOT
20 | 2.0.3.RELEASE
21 | 2.0.3.RELEASE
22 | 2.1.3.RELEASE
23 |
24 | 2.0.0.BUILD-SNAPSHOT
25 | 1.0.1.RELEASE
26 | 1.1.0.RELEASE
27 | 3.1.8.RELEASE
28 |
29 |
30 |
31 | spring-cloud-dataflow-server-cloudfoundry-docs
32 | spring-cloud-dataflow-server-cloudfoundry
33 | spring-cloud-dataflow-server-cloudfoundry-autoconfig
34 |
35 |
36 |
37 | spring
38 |
39 |
40 | spring-snapshots
41 | Spring Snapshots
42 | http://repo.spring.io/libs-snapshot-local
43 |
44 | true
45 |
46 |
47 |
48 | spring-milestones
49 | Spring Milestones
50 | http://repo.spring.io/libs-milestone-local
51 |
52 | false
53 |
54 |
55 |
56 | spring-releases
57 | Spring Releases
58 | http://repo.spring.io/release
59 |
60 | false
61 |
62 |
63 |
64 |
65 |
66 | spring-snapshots
67 | Spring Snapshots
68 | http://repo.spring.io/libs-snapshot-local
69 |
70 | true
71 |
72 |
73 |
74 | spring-milestones
75 | Spring Milestones
76 | http://repo.spring.io/libs-milestone-local
77 |
78 | false
79 |
80 |
81 |
82 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/.jdk8:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-autoconfig/.jdk8
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4.0.0
4 | spring-cloud-dataflow-server-cloudfoundry-autoconfig
5 | http://projects.spring.io/spring-cloud/
6 |
7 | Pivotal Software, Inc.
8 | http://www.spring.io
9 |
10 |
11 | org.springframework.cloud
12 | spring-cloud-dataflow-server-cloudfoundry-parent
13 | 2.0.0.BUILD-SNAPSHOT
14 |
15 |
16 |
17 | org.springframework.cloud
18 | spring-cloud-dataflow-server-core
19 | ${spring-cloud-dataflow.version}
20 |
21 |
22 | org.springframework.cloud
23 | spring-cloud-starter-common-security-config-web
24 | ${spring-cloud-common-security-config.version}
25 |
26 |
27 | org.springframework.cloud
28 | spring-cloud-deployer-cloudfoundry
29 | ${spring-cloud-deployer-cloudfoundry.version}
30 |
31 |
32 | org.springframework.cloud
33 | spring-cloud-deployer-resource-docker
34 | ${spring-cloud-deployer-spi.version}
35 |
36 |
37 | io.projectreactor
38 | reactor-core
39 | ${reactor.version}
40 |
41 |
42 | io.pivotal.spring.cloud
43 | spring-cloud-services-starter-config-client
44 | ${spring-cloud-services-starters.version}
45 | runtime
46 |
47 |
48 | org.springframework.cloud
49 | spring-cloud-cloudfoundry-connector
50 |
51 |
52 | org.springframework.cloud
53 | spring-cloud-spring-service-connector
54 |
55 |
56 |
57 |
58 | io.pivotal.spring.cloud
59 | spring-cloud-sso-connector
60 | 1.1.0.RELEASE
61 |
62 |
63 | io.pivotal
64 | pivotal-cloudfoundry-client-reactor
65 | ${pivotal-cf-client-reactor.version}
66 |
67 |
68 | org.springframework.cloud
69 | spring-cloud-scheduler-spi
70 | ${spring-cloud-scheduler-spi.version}
71 |
72 |
73 | org.springframework.cloud
74 | spring-cloud-scheduler-cloudfoundry
75 | ${spring-cloud-scheduler-cloudfoundry}
76 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/CloudFoundryDataFlowServerConfiguration.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2016-2018 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package org.springframework.cloud.dataflow.server.cloudfoundry.config;
18 |
19 | import javax.annotation.PostConstruct;
20 |
21 | import reactor.core.publisher.Hooks;
22 |
23 | import org.springframework.boot.autoconfigure.AutoConfigureBefore;
24 | import org.springframework.boot.context.properties.ConfigurationProperties;
25 | import org.springframework.cloud.dataflow.server.cloudfoundry.config.security.CloudFoundryOAuthSecurityConfiguration;
26 | import org.springframework.cloud.deployer.autoconfigure.DelegatingResourceLoaderBuilderCustomizer;
27 | import org.springframework.cloud.deployer.resource.docker.DockerResource;
28 | import org.springframework.cloud.deployer.resource.docker.DockerResourceLoader;
29 | import org.springframework.cloud.deployer.spi.cloudfoundry.CloudFoundryConnectionProperties;
30 | import org.springframework.cloud.deployer.spi.cloudfoundry.CloudFoundryDeployerAutoConfiguration;
31 | import org.springframework.cloud.deployer.spi.cloudfoundry.CloudFoundryDeploymentProperties;
32 | import org.springframework.context.annotation.Bean;
33 | import org.springframework.context.annotation.Configuration;
34 | import org.springframework.context.annotation.Import;
35 |
36 | /**
37 | * Configuration class for customizing Cloud Foundry deployer.
38 | *
39 | * @author Eric Bottard
40 | */
41 | @Configuration
42 | @Import(CloudFoundryOAuthSecurityConfiguration.class)
43 | @AutoConfigureBefore(CloudFoundryDeployerAutoConfiguration.class)
44 | public class CloudFoundryDataFlowServerConfiguration {
45 |
46 | @Bean
47 | @ConfigurationProperties(prefix = CloudFoundryConnectionProperties.CLOUDFOUNDRY_PROPERTIES + ".stream")
48 | public CloudFoundryDeploymentProperties appDeploymentProperties() {
49 | return new CloudFoundryDeploymentProperties();
50 | }
51 |
52 | @Bean
53 | @ConfigurationProperties(prefix = CloudFoundryConnectionProperties.CLOUDFOUNDRY_PROPERTIES + ".task")
54 | public CloudFoundryDeploymentProperties taskDeploymentProperties() {
55 | return new CloudFoundryDeploymentProperties();
56 | }
57 |
58 | @Bean
59 | @ConfigurationProperties(prefix = CloudFoundryServerConfigurationProperties.PREFIX)
60 | public CloudFoundryServerConfigurationProperties cloudFoundryServerConfigurationProperties() {
61 | return new CloudFoundryServerConfigurationProperties();
62 | }
63 |
64 | @Bean
65 | public DelegatingResourceLoaderBuilderCustomizer dockerDelegatingResourceLoaderBuilderCustomizer() {
66 | return customizer -> customizer.loader(DockerResource.URI_SCHEME, new DockerResourceLoader());
67 | }
68 |
69 | @PostConstruct
70 | public void afterPropertiesSet() {
71 | if (cloudFoundryServerConfigurationProperties().isDebugReactor()) {
72 | Hooks.onOperatorDebug();
73 | }
74 | }
75 |
76 | }
77 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/CloudFoundrySchedulerConfiguration.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2018 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.springframework.cloud.dataflow.server.cloudfoundry.config;
17 |
18 | import io.pivotal.reactor.scheduler.ReactorSchedulerClient;
19 | import org.cloudfoundry.operations.CloudFoundryOperations;
20 | import org.cloudfoundry.reactor.ConnectionContext;
21 | import org.cloudfoundry.reactor.TokenProvider;
22 | import reactor.core.publisher.Mono;
23 |
24 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
25 | import org.springframework.cloud.dataflow.server.config.features.SchedulerConfiguration;
26 | import org.springframework.cloud.deployer.spi.cloudfoundry.CloudFoundry2630AndLaterTaskLauncher;
27 | import org.springframework.cloud.deployer.spi.cloudfoundry.CloudFoundryConnectionProperties;
28 | import org.springframework.cloud.deployer.spi.task.TaskLauncher;
29 | import org.springframework.cloud.scheduler.spi.cloudfoundry.CloudFoundryAppScheduler;
30 | import org.springframework.cloud.scheduler.spi.cloudfoundry.CloudFoundrySchedulerProperties;
31 | import org.springframework.cloud.scheduler.spi.core.Scheduler;
32 | import org.springframework.context.annotation.Bean;
33 | import org.springframework.context.annotation.Conditional;
34 | import org.springframework.context.annotation.Configuration;
35 |
36 | /**
37 | * @author Mark Pollack
38 | */
39 | @Configuration
40 | @Conditional({ SchedulerConfiguration.SchedulerConfigurationPropertyChecker.class })
41 | public class CloudFoundrySchedulerConfiguration {
42 |
43 | @Bean
44 | @ConditionalOnMissingBean
45 | public ReactorSchedulerClient reactorSchedulerClient(ConnectionContext context,
46 | TokenProvider passwordGrantTokenProvider,
47 | CloudFoundrySchedulerProperties properties) {
48 | return ReactorSchedulerClient.builder()
49 | .connectionContext(context)
50 | .tokenProvider(passwordGrantTokenProvider)
51 | .root(Mono.just(properties.getSchedulerUrl()))
52 | .build();
53 | }
54 |
55 | @Bean
56 | @ConditionalOnMissingBean
57 | public Scheduler scheduler(ReactorSchedulerClient client,
58 | CloudFoundryOperations operations,
59 | CloudFoundryConnectionProperties properties,
60 | TaskLauncher taskLauncher,
61 | CloudFoundrySchedulerProperties schedulerProperties) {
62 | return new CloudFoundryAppScheduler(client, operations, properties,
63 | (CloudFoundry2630AndLaterTaskLauncher) taskLauncher,
64 | schedulerProperties);
65 | }
66 |
67 | @Bean
68 | @ConditionalOnMissingBean
69 | public CloudFoundrySchedulerProperties cloudFoundrySchedulerProperties() {
70 | return new CloudFoundrySchedulerProperties();
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/CloudFoundryServerConfigurationProperties.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package org.springframework.cloud.dataflow.server.cloudfoundry.config;
18 |
19 | import org.springframework.boot.context.properties.ConfigurationProperties;
20 | import org.springframework.validation.annotation.Validated;
21 |
22 | /**
23 | * {@link ConfigurationProperties} class to configure various settings of Data Flow
24 | * running on Cloud Foundry.
25 | *
26 | * @author Eric Bottard
27 | */
28 | @Validated
29 | @ConfigurationProperties(CloudFoundryServerConfigurationProperties.PREFIX)
30 | public class CloudFoundryServerConfigurationProperties {
31 |
32 | public static final String PREFIX = "spring.cloud.dataflow.server.cloudfoundry";
33 | /**
34 | * Whether to turn on reactor style stacktraces.
35 | */
36 | public boolean debugReactor = false;
37 |
38 | private int maxPoolSize = 10;
39 |
40 | int maxWaitTime = 30000;
41 |
42 | public boolean isDebugReactor() {
43 | return debugReactor;
44 | }
45 |
46 | public void setDebugReactor(boolean debugReactor) {
47 | this.debugReactor = debugReactor;
48 | }
49 |
50 | public int getMaxPoolSize() {
51 | return maxPoolSize;
52 | }
53 |
54 | public void setMaxPoolSize(int maxPoolSize) {
55 | this.maxPoolSize = maxPoolSize;
56 | }
57 |
58 | public int getMaxWaitTime() {
59 | return maxWaitTime;
60 | }
61 |
62 | public void setMaxWaitTime(int maxWaitTime) {
63 | this.maxWaitTime = maxWaitTime;
64 | }
65 |
66 | }
67 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/DataSourceCloudConfig.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2018 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.springframework.cloud.dataflow.server.cloudfoundry.config;
17 |
18 | import javax.sql.DataSource;
19 |
20 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
21 | import org.springframework.cloud.config.java.AbstractCloudConfig;
22 | import org.springframework.cloud.dataflow.server.config.features.FeaturesProperties;
23 | import org.springframework.cloud.service.PooledServiceConnectorConfig;
24 | import org.springframework.cloud.service.relational.DataSourceConfig;
25 | import org.springframework.context.annotation.Bean;
26 | import org.springframework.context.annotation.Configuration;
27 | import org.springframework.context.annotation.Profile;
28 | import org.springframework.data.redis.connection.RedisConnectionFactory;
29 |
30 | /**
31 | * Add declarative configuration of the max pool side and max wait time when using the
32 | * connector library.
33 | *
34 | * @author Mark Pollack
35 | */
36 | @Profile("cloud")
37 | @Configuration
38 | public class DataSourceCloudConfig extends AbstractCloudConfig {
39 |
40 | @Bean
41 | public DataSource scdfCloudDataSource(
42 | CloudFoundryServerConfigurationProperties cloudFoundryServerConfigurationProperties) {
43 | PooledServiceConnectorConfig.PoolConfig poolConfig = new PooledServiceConnectorConfig.PoolConfig(
44 | cloudFoundryServerConfigurationProperties.getMaxPoolSize(),
45 | cloudFoundryServerConfigurationProperties.getMaxWaitTime());
46 | DataSourceConfig dbConfig = new DataSourceConfig(poolConfig, null);
47 | return connectionFactory().dataSource(dbConfig);
48 | }
49 |
50 | @Bean
51 | @ConditionalOnProperty(prefix = FeaturesProperties.FEATURES_PREFIX, name = FeaturesProperties.ANALYTICS_ENABLED, matchIfMissing = true)
52 | public RedisConnectionFactory redisFactory() {
53 | return connectionFactory().redisConnectionFactory();
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/TaskFeatureAutoToggleEnvironmentPostProcessor.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package org.springframework.cloud.dataflow.server.cloudfoundry.config;
18 |
19 | import java.util.Collections;
20 |
21 | import com.github.zafarkhaja.semver.Version;
22 | import org.slf4j.Logger;
23 | import org.slf4j.LoggerFactory;
24 |
25 | import org.springframework.boot.SpringApplication;
26 | import org.springframework.boot.env.EnvironmentPostProcessor;
27 | import org.springframework.cloud.dataflow.server.config.features.FeaturesProperties;
28 | import org.springframework.cloud.deployer.spi.cloudfoundry.CloudFoundryDeployerAutoConfiguration;
29 | import org.springframework.cloud.deployer.spi.cloudfoundry.UnsupportedVersionTaskLauncher;
30 | import org.springframework.context.annotation.AnnotationConfigApplicationContext;
31 | import org.springframework.core.env.ConfigurableEnvironment;
32 | import org.springframework.core.env.MapPropertySource;
33 |
34 | /**
35 | * An {@link org.springframework.boot.env.EnvironmentPostProcessor} that turns off task support for Cloud Controller API
36 | * versions that are not supported.
37 | *
38 | * @author Eric Bottard
39 | * @author Ilayaperumal Gopinathan
40 | */
41 | public class TaskFeatureAutoToggleEnvironmentPostProcessor implements EnvironmentPostProcessor {
42 |
43 | private static final Logger logger = LoggerFactory.getLogger(TaskFeatureAutoToggleEnvironmentPostProcessor.class);
44 |
45 | private static final String TASKS_KEY = FeaturesProperties.FEATURES_PREFIX + "." + FeaturesProperties.TASKS_ENABLED;
46 |
47 | private static final String TASK_FEATURE_DEACTIVE_PROPERTIES = "Task Features De-activation";
48 |
49 | @Override
50 | public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
51 | AnnotationConfigApplicationContext applicationContext = null;
52 | // Create a throwaway AppContext to connect to CC API and assess its version.
53 | try {
54 | applicationContext = new AnnotationConfigApplicationContext();
55 | applicationContext.register(CloudFoundryDeployerAutoConfiguration.EarlyConnectionConfiguration.class);
56 | applicationContext.setEnvironment(environment); // Inherit current environment
57 | applicationContext.refresh();
58 |
59 | Version version = applicationContext.getBean(Version.class);
60 | if (version.lessThan(UnsupportedVersionTaskLauncher.MINIMUM_SUPPORTED_VERSION)) {
61 | logger.warn("Targeting Cloud Foundry API {}, which is incompatible with TaskLauncher support. Forcing {} to false",
62 | version, TASKS_KEY);
63 | environment.getPropertySources().addFirst(new MapPropertySource(TASK_FEATURE_DEACTIVE_PROPERTIES,
64 | Collections.singletonMap(TASKS_KEY, "false")));
65 | }
66 | }
67 | catch (Exception ignored) { // Might happen in particular in Integration Tests not targeting an actual CF runtime
68 | logger.warn("Could not connect to Cloud Foundry to probe API version", ignored);
69 | }
70 | finally {
71 | if (applicationContext != null) {
72 | applicationContext.close();
73 | }
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/security/CloudFoundryOAuthSecurityConfiguration.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.springframework.cloud.dataflow.server.cloudfoundry.config.security;
17 |
18 | import javax.annotation.PostConstruct;
19 |
20 | import org.slf4j.Logger;
21 | import org.slf4j.LoggerFactory;
22 |
23 | import org.springframework.beans.factory.annotation.Autowired;
24 | import org.springframework.beans.factory.annotation.Value;
25 | import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform;
26 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
27 | import org.springframework.boot.autoconfigure.security.oauth2.resource.PrincipalExtractor;
28 | import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices;
29 | import org.springframework.boot.cloud.CloudPlatform;
30 | import org.springframework.cloud.common.security.OAuthSecurityConfiguration;
31 | import org.springframework.cloud.common.security.support.DefaultAuthoritiesExtractor;
32 | import org.springframework.cloud.common.security.support.OnOAuth2SecurityEnabled;
33 | import org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support.CloudFoundryDataflowAuthoritiesExtractor;
34 | import org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support.CloudFoundryPrincipalExtractor;
35 | import org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support.CloudFoundrySecurityService;
36 | import org.springframework.context.annotation.Bean;
37 | import org.springframework.context.annotation.Conditional;
38 | import org.springframework.context.annotation.Configuration;
39 | import org.springframework.context.annotation.Import;
40 | import org.springframework.security.oauth2.client.OAuth2RestTemplate;
41 |
42 | /**
43 | * When running inside Cloud Foundry, this {@link Configuration} class will reconfigure
44 | * Spring Cloud Data Flow's security setup in {@link OAuthSecurityConfiguration}, so that
45 | * only users with the CF_SPACE_DEVELOPER_ROLE} can access the REST APIs.
46 | *
47 | * Therefore, this configuration will ensure that only Cloud Foundry
48 | * {@code Space Developers} have access to the underlying REST API's.
49 | *
50 | * For this to happen, a REST call will be made to the Cloud Foundry Permissions API via
51 | * CloudFoundrySecurityService inside the {@link DefaultAuthoritiesExtractor}.
52 | *
53 | * If the user has the respective permissions, the CF_SPACE_DEVELOPER_ROLE will be
54 | * assigned to the user.
55 | *
56 | * See also:
57 | * https://apidocs.cloudfoundry.org/258/apps/retrieving_permissions_on_a_app.html
58 | *
59 | * @author Gunnar Hillert
60 | * @author Ilayaperumal Gopinathan
61 | */
62 | @Configuration
63 | @ConditionalOnCloudPlatform(CloudPlatform.CLOUD_FOUNDRY)
64 | @Conditional(OnOAuth2SecurityEnabled.class)
65 | @Import(CloudFoundryOAuthSecurityConfiguration.CloudFoundryUAAConfiguration.class)
66 | public class CloudFoundryOAuthSecurityConfiguration {
67 |
68 | private static final Logger logger = LoggerFactory.getLogger(CloudFoundryOAuthSecurityConfiguration.class);
69 |
70 | @Autowired
71 | private UserInfoTokenServices userInfoTokenServices;
72 |
73 | @Autowired(required = false)
74 | private CloudFoundryDataflowAuthoritiesExtractor cloudFoundryDataflowAuthoritiesExtractor;
75 |
76 | @Autowired(required = false)
77 | private PrincipalExtractor principalExtractor;
78 |
79 | @PostConstruct
80 | public void init() {
81 | if (this.cloudFoundryDataflowAuthoritiesExtractor != null) {
82 | logger.info("Setting up Cloud Foundry AuthoritiesExtractor for UAA.");
83 | this.userInfoTokenServices.setAuthoritiesExtractor(this.cloudFoundryDataflowAuthoritiesExtractor);
84 | }
85 | if (this.principalExtractor != null) {
86 | logger.info("Setting up Cloud Foundry PrincipalExtractor.");
87 | this.userInfoTokenServices.setPrincipalExtractor(this.principalExtractor);
88 | }
89 | else {
90 | this.userInfoTokenServices.setPrincipalExtractor(new CloudFoundryPrincipalExtractor());
91 | }
92 | }
93 |
94 | @Configuration
95 | @ConditionalOnProperty(name = "spring.cloud.dataflow.security.cf-use-uaa", havingValue = "true")
96 | public class CloudFoundryUAAConfiguration {
97 |
98 | @Value("${vcap.application.cf_api}")
99 | private String cloudControllerUrl;
100 |
101 | @Value("${vcap.application.application_id}")
102 | private String applicationId;
103 |
104 | @Autowired
105 | private OAuth2RestTemplate oAuth2RestTemplate;
106 |
107 | @Bean
108 | public CloudFoundryDataflowAuthoritiesExtractor authoritiesExtractor() {
109 | return new CloudFoundryDataflowAuthoritiesExtractor(cloudFoundrySecurityService());
110 | }
111 |
112 | @Bean
113 | public CloudFoundrySecurityService cloudFoundrySecurityService() {
114 | return new CloudFoundrySecurityService(this.oAuth2RestTemplate, this.cloudControllerUrl,
115 | this.applicationId);
116 | }
117 |
118 | }
119 |
120 | }
121 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/security/support/AccessLevel.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support;
17 |
18 | import java.util.Arrays;
19 | import java.util.List;
20 |
21 | import javax.servlet.http.HttpServletRequest;
22 |
23 | /**
24 | * The specific access level granted to the Cloud Foundry user that's calling the
25 | * endpoints.
26 | *
27 | * @author Madhura Bhave
28 | * @author Gunnar Hillert
29 | */
30 | public enum AccessLevel {
31 |
32 | /**
33 | * Restricted access to a limited set of endpoints.
34 | */
35 | RESTRICTED("", "/health", "/info"),
36 |
37 | /**
38 | * No access.
39 | */
40 | NONE,
41 |
42 | /**
43 | * Full access to all endpoints.
44 | */
45 | FULL;
46 |
47 | private static final String REQUEST_ATTRIBUTE = "cloudFoundryAccessLevel";
48 |
49 | private final List endpointPaths;
50 |
51 | AccessLevel(String... endpointPaths) {
52 | this.endpointPaths = Arrays.asList(endpointPaths);
53 | }
54 |
55 | /**
56 | * Returns if the access level should allow access to the specified endpoint path.
57 | * @param endpointPath the endpoint path
58 | * @return {@code true} if access is allowed
59 | */
60 | public boolean isAccessAllowed(String endpointPath) {
61 | return this.endpointPaths.isEmpty() || this.endpointPaths.contains(endpointPath);
62 | }
63 |
64 | public void put(HttpServletRequest request) {
65 | request.setAttribute(REQUEST_ATTRIBUTE, this);
66 | }
67 |
68 | public static AccessLevel get(HttpServletRequest request) {
69 | return (AccessLevel) request.getAttribute(REQUEST_ATTRIBUTE);
70 | }
71 |
72 | }
73 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/security/support/CloudFoundryAuthorizationException.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support;
17 |
18 | import org.springframework.http.HttpStatus;
19 |
20 | /**
21 | * Authorization exceptions thrown to limit access to the endpoints.
22 | *
23 | * @author Madhura Bhave
24 | */
25 | public class CloudFoundryAuthorizationException extends RuntimeException {
26 |
27 | private static final long serialVersionUID = 1L;
28 |
29 | private final Reason reason;
30 |
31 | CloudFoundryAuthorizationException(Reason reason, String message) {
32 | this(reason, message, null);
33 | }
34 |
35 | CloudFoundryAuthorizationException(Reason reason, String message, Throwable cause) {
36 | super(message);
37 | this.reason = reason;
38 | }
39 |
40 | /**
41 | * Return the status code that should be returned to the client.
42 | * @return the HTTP status code
43 | */
44 | public HttpStatus getStatusCode() {
45 | return getReason().getStatus();
46 | }
47 |
48 | /**
49 | * Return the reason why the authorization exception was thrown.
50 | * @return the reason
51 | */
52 | public Reason getReason() {
53 | return this.reason;
54 | }
55 |
56 | /**
57 | * Reasons why the exception can be thrown.
58 | */
59 | enum Reason {
60 |
61 | ACCESS_DENIED(HttpStatus.FORBIDDEN),
62 |
63 | INVALID_AUDIENCE(HttpStatus.UNAUTHORIZED),
64 |
65 | INVALID_ISSUER(HttpStatus.UNAUTHORIZED),
66 |
67 | INVALID_KEY_ID(HttpStatus.UNAUTHORIZED),
68 |
69 | INVALID_SIGNATURE(HttpStatus.UNAUTHORIZED),
70 |
71 | INVALID_TOKEN(HttpStatus.UNAUTHORIZED),
72 |
73 | MISSING_AUTHORIZATION(HttpStatus.UNAUTHORIZED),
74 |
75 | TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED),
76 |
77 | UNSUPPORTED_TOKEN_SIGNING_ALGORITHM(HttpStatus.UNAUTHORIZED),
78 |
79 | SERVICE_UNAVAILABLE(HttpStatus.SERVICE_UNAVAILABLE);
80 |
81 | private final HttpStatus status;
82 |
83 | Reason(HttpStatus status) {
84 | this.status = status;
85 | }
86 |
87 | public HttpStatus getStatus() {
88 | return this.status;
89 | }
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/security/support/CloudFoundryDataflowAuthoritiesExtractor.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support;
17 |
18 |
19 | import java.util.ArrayList;
20 | import java.util.List;
21 | import java.util.Map;
22 | import java.util.stream.Collectors;
23 | import java.util.stream.Stream;
24 |
25 | import org.slf4j.LoggerFactory;
26 |
27 | import org.springframework.boot.autoconfigure.security.oauth2.resource.AuthoritiesExtractor;
28 | import org.springframework.cloud.common.security.support.CoreSecurityRoles;
29 | import org.springframework.cloud.common.security.support.SecurityConfigUtils;
30 | import org.springframework.security.config.core.GrantedAuthorityDefaults;
31 | import org.springframework.security.core.GrantedAuthority;
32 | import org.springframework.security.core.authority.SimpleGrantedAuthority;
33 | import org.springframework.util.Assert;
34 | import org.springframework.util.StringUtils;
35 |
36 | /**
37 | * This Spring Cloud Data Flow {@link AuthoritiesExtractor} will assign all
38 | * {@link CoreSecurityRoles} to the authenticated OAuth2 user IF the user is a "Space
39 | * Developer" in Cloud Foundry.
40 | *
41 | * @author Gunnar Hillert
42 | *
43 | */
44 | public class CloudFoundryDataflowAuthoritiesExtractor implements AuthoritiesExtractor {
45 |
46 | private static final org.slf4j.Logger logger = LoggerFactory
47 | .getLogger(CloudFoundryDataflowAuthoritiesExtractor.class);
48 |
49 | private final CloudFoundrySecurityService cloudFoundrySecurityService;
50 |
51 | public CloudFoundryDataflowAuthoritiesExtractor(CloudFoundrySecurityService cloudFoundrySecurityService) {
52 | this.cloudFoundrySecurityService = cloudFoundrySecurityService;
53 | }
54 |
55 | /**
56 | * The returned {@link List} of {@link GrantedAuthority}s contains all roles from
57 | * {@link CoreSecurityRoles}. The roles are prefixed with the value specified in
58 | * {@link GrantedAuthorityDefaults}.
59 | *
60 | * @param map Must not be null. Is only used for logging
61 | */
62 | @Override
63 | public List extractAuthorities(Map map) {
64 | Assert.notNull(map, "The map argument must not be null.");
65 |
66 | if (cloudFoundrySecurityService.isSpaceDeveloper()) {
67 | final List rolesAsStrings = new ArrayList<>();
68 | final List grantedAuthorities = Stream.of(CoreSecurityRoles.values())
69 | .map(roleEnum -> {
70 | final String roleName = SecurityConfigUtils.ROLE_PREFIX + roleEnum.getKey();
71 | rolesAsStrings.add(roleName);
72 | return new SimpleGrantedAuthority(roleName);
73 | })
74 | .collect(Collectors.toList());
75 | logger.info("Adding ALL roles {} to Cloud Foundry Space Developer user {}",
76 | StringUtils.collectionToCommaDelimitedString(rolesAsStrings), map);
77 | return grantedAuthorities;
78 | }
79 | else {
80 | return new ArrayList<>(0);
81 | }
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/security/support/CloudFoundryPrincipalExtractor.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support;
17 |
18 | import java.util.Map;
19 |
20 | import org.springframework.boot.autoconfigure.security.oauth2.resource.PrincipalExtractor;
21 |
22 | /**
23 | * A Cloud Foundry specific {@link PrincipalExtractor} that extracts the username.
24 | *
25 | * @author Gunnar Hillert
26 | *
27 | */
28 | public class CloudFoundryPrincipalExtractor implements PrincipalExtractor {
29 |
30 | private static final String[] PRINCIPAL_KEYS = new String[] { "user_name", "user", "username",
31 | "userid", "user_id", "login", "id", "name" };
32 |
33 | @Override
34 | public Object extractPrincipal(Map map) {
35 | for (String key : PRINCIPAL_KEYS) {
36 | if (map.containsKey(key)) {
37 | return map.get(key);
38 | }
39 | }
40 | return null;
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/java/org/springframework/cloud/dataflow/server/cloudfoundry/config/security/support/CloudFoundrySecurityService.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2017 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support;
17 |
18 | import java.net.URI;
19 | import java.net.URISyntaxException;
20 | import java.util.Map;
21 |
22 | import org.slf4j.Logger;
23 | import org.slf4j.LoggerFactory;
24 |
25 | import org.springframework.cloud.dataflow.server.cloudfoundry.config.security.support.CloudFoundryAuthorizationException.Reason;
26 | import org.springframework.http.HttpStatus;
27 | import org.springframework.http.RequestEntity;
28 | import org.springframework.security.oauth2.client.OAuth2RestTemplate;
29 | import org.springframework.security.oauth2.common.OAuth2AccessToken;
30 | import org.springframework.util.Assert;
31 | import org.springframework.web.client.HttpClientErrorException;
32 | import org.springframework.web.client.HttpServerErrorException;
33 |
34 | /**
35 | * Cloud Foundry security service to handle REST calls to the cloud controller and UAA.
36 | *
37 | * @author Madhura Bhave
38 | * @author Gunnar Hillert
39 | * @author Ilayaperumal Gopinathan
40 | *
41 | */
42 | public class CloudFoundrySecurityService {
43 |
44 | private static final Logger logger = LoggerFactory.getLogger(CloudFoundrySecurityService.class);
45 |
46 | private final OAuth2RestTemplate oAuth2RestTemplate;
47 |
48 | private final String cloudControllerUrl;
49 |
50 | private final String applicationId;
51 |
52 | public CloudFoundrySecurityService(OAuth2RestTemplate oAuth2RestTemplate, String cloudControllerUrl,
53 | String applicationId) {
54 | Assert.notNull(oAuth2RestTemplate, "OAuth2RestTemplate must not be null.");
55 | Assert.notNull(cloudControllerUrl, "CloudControllerUrl must not be null.");
56 | Assert.notNull(applicationId, "ApplicationId must not be null.");
57 | this.oAuth2RestTemplate = oAuth2RestTemplate;
58 | this.cloudControllerUrl = cloudControllerUrl;
59 | this.applicationId = applicationId;
60 | }
61 |
62 | /**
63 | * Returns {@code true} if the user (using the access-token from
64 | * {@link OAuth2RestTemplate}) has full {@link AccessLevel#FULL} for the provided
65 | * {@code applicationId}
66 | *
67 | * @return true of the user is a space developer in Cloud Foundry
68 | */
69 | public boolean isSpaceDeveloper() {
70 | final OAuth2AccessToken accessToken = this.oAuth2RestTemplate.getAccessToken();
71 | logger.info("The accessToken is: " + accessToken.getValue());
72 | final AccessLevel accessLevel = getAccessLevel(
73 | accessToken.getValue(), applicationId);
74 |
75 | if (AccessLevel.FULL.equals(accessLevel)) {
76 | return true;
77 | }
78 | else {
79 | return false;
80 | }
81 | }
82 |
83 | /**
84 | * Return the access level that should be granted to the given token.
85 | * @param token the token
86 | * @param applicationId the cloud foundry application ID
87 | * @return the access level that should be granted
88 | * @throws CloudFoundryAuthorizationException if the token is not authorized
89 | */
90 | public AccessLevel getAccessLevel(String token, String applicationId)
91 | throws CloudFoundryAuthorizationException {
92 | try {
93 | final URI permissionsUri = getPermissionsUri(applicationId);
94 | logger.info("Using PermissionsUri: " + permissionsUri);
95 | RequestEntity> request = RequestEntity.get(permissionsUri)
96 | .header("Authorization", "bearer " + token).build();
97 | Map, ?> body = this.oAuth2RestTemplate.exchange(request, Map.class).getBody();
98 | if (Boolean.TRUE.equals(body.get("read_sensitive_data"))) {
99 | return AccessLevel.FULL;
100 | }
101 | else {
102 | return AccessLevel.RESTRICTED;
103 | }
104 | }
105 | catch (HttpClientErrorException ex) {
106 | if (ex.getStatusCode().equals(HttpStatus.FORBIDDEN)) {
107 | return AccessLevel.NONE;
108 | }
109 | throw new CloudFoundryAuthorizationException(Reason.INVALID_TOKEN,
110 | "Invalid token", ex);
111 | }
112 | catch (HttpServerErrorException ex) {
113 | throw new CloudFoundryAuthorizationException(Reason.SERVICE_UNAVAILABLE,
114 | "Cloud controller not reachable");
115 | }
116 | }
117 |
118 | private URI getPermissionsUri(String applicationId) {
119 | try {
120 | return new URI(this.cloudControllerUrl + "/v2/apps/" + applicationId
121 | + "/permissions");
122 | }
123 | catch (URISyntaxException ex) {
124 | throw new IllegalStateException(ex);
125 | }
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-autoconfig/src/main/resources/META-INF/spring.factories:
--------------------------------------------------------------------------------
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2 | org.springframework.cloud.dataflow.server.cloudfoundry.config.CloudFoundryDataFlowServerConfiguration,\
3 | org.springframework.cloud.dataflow.server.cloudfoundry.config.CloudFoundrySchedulerConfiguration
4 | org.springframework.boot.env.EnvironmentPostProcessor=\
5 | org.springframework.cloud.dataflow.server.cloudfoundry.config.TaskFeatureAutoToggleEnvironmentPostProcessor
6 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/.jdk8:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/.jdk8
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/Guardfile:
--------------------------------------------------------------------------------
1 | require 'asciidoctor'
2 | require 'erb'
3 |
4 | guard 'shell' do
5 | watch(/.*\.adoc$/) {|m|
6 | Asciidoctor.render_file('index.adoc', \
7 | :in_place => true, \
8 | :safe => Asciidoctor::SafeMode::UNSAFE, \
9 | :attributes=> { \
10 | 'source-highlighter' => 'prettify', \
11 | 'icons' => 'font', \
12 | 'linkcss'=> 'true', \
13 | 'copycss' => 'true', \
14 | 'doctype' => 'book'})
15 | }
16 | end
17 |
18 | guard 'livereload' do
19 | watch(%r{^.+\.(css|js|html)$})
20 | end
21 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/api-guide-link.adoc:
--------------------------------------------------------------------------------
1 | // The API Guide asciidoc source file residing in SCDF core cannot be included here, because it depends on generated
2 | // REST Docs snippets that are not versioned (and are heavyweight to regenerate for each flavor). Hence, we do a
3 | // simple link to the correct SCDF core version:
4 | :spring-cloud-dataflow-docs-rest: http://docs.spring.io/spring-cloud-dataflow/docs/{scdf-core-version}/reference/htmlsingle/index.html#api-guide
5 |
6 | [[api-guide]]
7 | = REST API Guide
8 |
9 | You can find the documentation about the Data Flow REST API in the {spring-cloud-dataflow-docs-rest}[core documentation].
10 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/appendix.adoc:
--------------------------------------------------------------------------------
1 | [[appendix]]
2 | = Appendices
3 |
4 | Having trouble with Spring Cloud Data Flow? We'd like to help!
5 |
6 | * Ask a question. We monitor http://stackoverflow.com[stackoverflow.com] for questions tagged with http://stackoverflow.com/tags/spring-cloud-dataflow[`spring-cloud-dataflow`].
7 | * Report bugs with Spring Cloud Data Flow at https://github.com/spring-cloud/spring-cloud-dataflow/issues.
8 | * Report bugs with Spring Cloud Data Flow for Cloud Foundry at https://github.com/spring-cloud/spring-cloud-dataflow-server-cloudfoundry/issues.
9 |
10 | include::{dataflow-asciidoc}/appendix-dataflow-template.adoc[]
11 | include::{dataflow-asciidoc}/appendix-migration-guide.adoc[]
12 | include::{dataflow-asciidoc}/appendix-building.adoc[]
13 | include::{dataflow-asciidoc}/appendix-contributing.adoc[]
14 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/building.adoc:
--------------------------------------------------------------------------------
1 | [appendix]
2 | [[building]]
3 | == Building
4 |
5 | :jdkversion: 1.8
6 |
7 | === Basic Compile and Test
8 |
9 | To build the source you will need to install JDK {jdkversion}.
10 |
11 | The build uses the Maven wrapper so you don't have to install a specific
12 | version of Maven. To enable the tests for Redis you should run the server
13 | before bulding. See below for more information on how run Redis.
14 |
15 | The main build command is
16 |
17 | ----
18 | $ ./mvnw clean install
19 | ----
20 |
21 | You can also add '-DskipTests' if you like, to avoid running the tests.
22 |
23 | NOTE: You can also install Maven (>=3.3.3) yourself and run the `mvn` command
24 | in place of `./mvnw` in the examples below. If you do that you also
25 | might need to add `-P spring` if your local Maven settings do not
26 | contain repository declarations for spring pre-release artifacts.
27 |
28 | NOTE: Be aware that you might need to increase the amount of memory
29 | available to Maven by setting a `MAVEN_OPTS` environment variable with
30 | a value like `-Xmx512m -XX:MaxPermSize=128m`. We try to cover this in
31 | the `.mvn` configuration, so if you find you have to do it to make a
32 | build succeed, please raise a ticket to get the settings added to
33 | source control.
34 |
35 |
36 | The projects that require middleware generally include a
37 | `docker-compose.yml`, so consider using
38 | https://www.docker.com/products/docker-compose[Docker Compose] to run the middeware servers
39 | in Docker containers. See the README in the
40 | https://github.com/spring-cloud-samples/scripts[scripts demo
41 | repository] for specific instructions about the common cases of mongo,
42 | rabbit and redis.
43 |
44 | === Documentation
45 |
46 | There is a "full" profile that will generate documentation. You can build just the documentation by executing
47 |
48 | [listing, subs=attributes]
49 | ----
50 | $ ./mvnw package -DskipTests=true -P full -pl {project-artifactId} -am
51 | ----
52 |
53 | === Working with the code
54 | If you don't have an IDE preference we would recommend that you use
55 | http://www.springsource.com/developer/sts[Spring Tools Suite] or
56 | http://eclipse.org[Eclipse] when working with the code. We use the
57 | http://eclipse.org/m2e/[m2eclipe] eclipse plugin for maven support. Other IDEs and tools
58 | should also work without issue.
59 |
60 | ==== Importing into eclipse with m2eclipse
61 | We recommend the http://eclipse.org/m2e/[m2eclipe] eclipse plugin when working with
62 | eclipse. If you don't already have m2eclipse installed it is available from the "eclipse
63 | marketplace".
64 |
65 | Unfortunately m2e does not yet support Maven 3.3, so once the projects
66 | are imported into Eclipse you will also need to tell m2eclipse to use
67 | the `.settings.xml` file for the projects. If you do not do this you
68 | may see many different errors related to the POMs in the
69 | projects. Open your Eclipse preferences, expand the Maven
70 | preferences, and select User Settings. In the User Settings field
71 | click Browse and navigate to the Spring Cloud project you imported
72 | selecting the `.settings.xml` file in that project. Click Apply and
73 | then OK to save the preference changes.
74 |
75 | NOTE: Alternatively you can copy the repository settings from https://github.com/spring-cloud/spring-cloud-build/blob/master/.settings.xml[`.settings.xml`] into your own `~/.m2/settings.xml`.
76 |
77 | ==== Importing into eclipse without m2eclipse
78 | If you prefer not to use m2eclipse you can generate eclipse project metadata using the
79 | following command:
80 |
81 | ----
82 | $ ./mvnw eclipse:eclipse
83 | ----
84 |
85 | The generated eclipse projects can be imported by selecting `import existing projects`
86 | from the `file` menu.
87 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/cf-tasks.adoc:
--------------------------------------------------------------------------------
1 | [[tasks-on-cloudfoundry]]
2 | = Tasks on Cloud Foundry
3 |
4 | Spring Cloud Data Flow's task functionality exposes new task capabilities within
5 | the Pivotal Cloud Foundry runtime.
6 |
7 | == Version Compatibility
8 |
9 | The task functionality depends on the latest versions of PCF for runtime support. This
10 | release requires PCF version 1.7.12 or higher to run tasks. Tasks are an experimental
11 | feature in PCF 1.7 and 1.8 and a GA feature in PCF 1.9.
12 |
13 | == Running Task Applications
14 |
15 | Running a task application within Spring Cloud Data Flow goes through a slightly different
16 | lifecycle than running a stream application. Both types of applications need to be registered
17 | with the appropriate artifact coordinates. Both need a definition created with the SCDF DSL.
18 | However, the similarities end there.
19 |
20 | With stream-based applications, you "`deploy`" them with the intent that they run until they
21 | are undeployed. A stream definition is only deployed once (it can be scaled, but only
22 | deployed as one instance of the stream as a whole). However, tasks are "`launched`". A single
23 | task definition can be launched many times. With each launch, the task starts, runs,
24 | and shuts down, with PCF cleaning up the resources once the shutdown has occurred. The
25 | following sections outline the process of creating, launching, destroying, and viewing tasks.
26 |
27 | === Creating a Task
28 |
29 | Similar to streams, creating a task application is done by using the SCDF DSL or through the
30 | dashboard. To create a task definition in SCDF, you must either develop a task
31 | application or use one of the out-of-the-box link:http://docs.spring.io/spring-cloud-task-app-starters/docs/{sct-starters-core-version}/reference/htmlsingle[task app-starters].
32 | The maven coordinates of the task application should be registered in SCDF. For more
33 | details on how to register task applications, see link:https://docs.spring.io/spring-cloud-dataflow/docs/{scdf-core-version}/reference/htmlsingle/#spring-cloud-dataflow-register-task-apps[Registering a Task Application]
34 | in the core docs.
35 |
36 | The following example uses the out-of-the-box `timestamp` task application:
37 |
38 | ====
39 | [source]
40 | ----
41 | dataflow:>task create --name foo --definition "timestamp"
42 | Created new task 'foo'
43 | ----
44 | ====
45 |
46 | NOTE: Tasks in SCDF do not require explicit deployment. They are required to be launched,
47 | and there are different ways to launch them - see https://docs.spring.io/spring-cloud-task/docs/current/reference/htmlsingle/#stream-integration-launching-sink[Launching Tasks from a Spring Cloud Stream] for more details.
48 |
49 | === Launching a Task
50 |
51 | Unlike streams, tasks in SCDF require an explicit launch trigger or can be manually kicked-off. The following example shows how to launch a task called `mytask`
52 |
53 | ====
54 | [source]
55 | ----
56 | dataflow:>task launch mytask
57 | Launched task 'mytask'
58 | ----
59 | ====
60 |
61 | === Launching a Task with Arguments and Properties
62 |
63 | When you launch a task, you can set any properties that need to be passed as command line arguments to the task application when launching the task as follows:
64 |
65 | ====
66 | [source,bash]
67 | ----
68 | dataflow:>task launch mytask --arguments "--key1=value1,--key2=value2"
69 | ----
70 | ====
71 |
72 | You can pass in additional properties meant for a `TaskLauncher` itself by using a `--properties` option.
73 | The format of this option is a comma-separated string of properties prefixed with `app..`.
74 | Properties are passed to `TaskLauncher` as application properties.
75 | It is up to an implementation to choose how those are passed into an actual task application.
76 | If the property is prefixed with `deployer` instead of `app`, it is passed to `TaskLauncher` as a deployment property and its meaning may be specific to the `TaskLauncher` implementation. The following example shows how to pass in application properties:
77 |
78 | ====
79 | [source,bash]
80 | ----
81 | dataflow:>task launch mytask --properties "deployer.timestamp.custom1=value1,app.timestamp.custom2=value2"
82 | ----
83 | ====
84 |
85 | You can also pass JAVA_OPTS values as the CF deployer property when the task is launched, as the following example shows
86 |
87 | ====
88 | [source,bash]
89 | ----
90 | task launch --name mytask --properties "deployer.mytask.cloudfoundry.javaOpts=-Duser.timezone=America/New_York"
91 | ----
92 | ====
93 |
94 | You can also set the JAVA_OPTS values as the global property for all the tasks by using
95 | `SPRING_CLOUD_DEPLOYER_CLOUDFOUNDRY_TASK_JAVA_OPTS`
96 |
97 | === Viewing Task Logs
98 |
99 | The CF CLI is the way to interact with tasks on PCF,
100 | including viewing the logs. In order to view the logs as a task is executing, you can use the
101 | following command, where `mytask` is the name of the task you are executing:
102 |
103 | ====
104 | [source,bash]
105 | ----
106 | cf v3-logs mytask
107 | Tailing logs for app mytask...
108 |
109 | ....
110 | ....
111 | ....
112 | ....
113 |
114 | 2016-08-19T09:44:49.11-0700 [APP/TASK/bar1/0]OUT 2016-08-19 16:44:49.111 INFO 7 --- [ main] o.s.c.t.a.t.TimestampTaskApplication : Started TimestampTaskApplication in 2.734 seconds (JVM running for 3.288)
115 | 2016-08-19T09:44:49.13-0700 [APP/TASK/bar1/0]OUT Exit status 0
116 | 2016-08-19T09:44:49.19-0700 [APP/TASK/bar1/0]OUT Destroying container
117 | 2016-08-19T09:44:50.41-0700 [APP/TASK/bar1/0]OUT Successfully destroyed container
118 | ----
119 | ====
120 |
121 | NOTE: Logs are viewable only through the CF CLI as the app is running. Historic
122 | logs are not available.
123 |
124 | === Listing Tasks
125 |
126 | Listing tasks is as simple as the following example (which includes output):
127 |
128 | ====
129 | [source]
130 | ----
131 | dataflow:>task list
132 | ╔══════════════════════╤═════════════════════════╤═══════════╗
133 | ║ Task Name │ Task Definition │Task Status║
134 | ╠══════════════════════╪═════════════════════════╪═══════════╣
135 | ║foo │timestamp │complete ║
136 | ╚══════════════════════╧═════════════════════════╧═══════════╝
137 | ----
138 | ====
139 |
140 | === Listing Task Executions
141 |
142 | If you want to view the execution details of the launched task, you could run the following:
143 |
144 | ====
145 | [source]
146 | ----
147 | dataflow:>task execution list
148 | ╔════════════════════════╤══╤═════════════════════════╤═════════════════════════╤════════╗
149 | ║ Task Name │ID│ Start Time │ End Time │ Exit ║
150 | ║ │ │ │ │ Code ║
151 | ╠════════════════════════╪══╪═════════════════════════╪═════════════════════════╪════════╣
152 | ║foo:cloud: │1 │ Fri Aug 19 09:44:49 PDT │Fri Aug 19 09:44:49 PDT │0 ║
153 | ╚════════════════════════╧══╧═════════════════════════╧═════════════════════════╧════════╝
154 | ----
155 | ====
156 |
157 | === Destroying a Task
158 |
159 | Destroying the task application from SCDF removes the task definition from the task repository. The following listing (which includes output) shows how to destroy a task named `mytask` and verify that it has been removed from the task list:
160 |
161 | [source]
162 | ----
163 | dataflow:>task destroy mytask
164 | Destroyed task 'mytask'
165 | dataflow:>task list
166 | ╔═════════╤═══════════════╤═══════════╗
167 | ║Task Name│Task Definition│Task Status║
168 | ╚═════════╧═══════════════╧═══════════╝
169 | ----
170 |
171 | === Deleting a Task From Cloud Foundry
172 |
173 | Currently, Spring Cloud Data Flow does not delete tasks deployed on a Cloud
174 | Foundry instance once they have been pushed. The only way to do this now is through the
175 | CLI on a Cloud Foundry instance, version 1.9 or above.
176 | This is done in two steps:
177 |
178 | . Obtain a list of the apps by using the `cf apps` command.
179 | . Identify the task application to be deleted and run the `cf delete `
180 | command.
181 |
182 | NOTE: The `task destroy ` deletes only the definition and not the task
183 | deployed on Cloud Foundry.
184 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/docinfo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
25 |
26 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/images/PLACE_IMAGES_HERE:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/images/PLACE_IMAGES_HERE
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/images/cf-getting-started-security-no-roles.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/images/cf-getting-started-security-no-roles.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/index-docinfo.xml:
--------------------------------------------------------------------------------
1 | Spring Cloud Data Flow Server for Cloud Foundry
2 | {project-version}
3 |
4 | 2013-2017
5 | Pivotal Software, Inc.
6 |
7 |
8 |
9 | Copies of this document may be made for your own use and for distribution to
10 | others, provided that you do not charge any fee for such copies and further
11 | provided that each copy contains this Copyright Notice, whether distributed in
12 | print or electronically.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | Pivotal Software, Inc.
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/index.adoc:
--------------------------------------------------------------------------------
1 | = Spring Cloud Data Flow Server for Cloud Foundry
2 | Sabby Anandan; Eric Bottard; Mark Fisher; Ilayaperumal Gopinathan; Gunnar Hillert; Mark Pollack; Thomas Risberg; Marius Bogoevici; Josh Long; Michael Minella; David Turanski; Vinicius Carvalho; Jay Bryant; Glenn Renfro; Christian Tzolov
3 | :doctype: book
4 | :toc: left
5 | :toclevels: 4
6 | :source-highlighter: prettify
7 | :numbered:
8 | :icons: font
9 | :hide-uri-scheme:
10 | :docinfo: shared
11 | :sectanchors:
12 |
13 |
14 | :spring-cloud-stream-docs: http://docs.spring.io/spring-cloud-stream/docs/{scst-core-version}/reference/htmlsingle/index.html
15 | :github-code: https://github.com/spring-cloud/spring-cloud-dataflow-server-cloudfoundry
16 |
17 | ifdef::backend-html5[]
18 |
19 | Version: {project-version}
20 |
21 | (C) 2012-2018 Pivotal Software, Inc.
22 |
23 | Copies of this document may be made for your own use and for distribution to
24 | others, provided that you do not charge any fee for such copies and further
25 | provided that each copy contains this Copyright Notice, whether distributed in
26 | print or electronically.
27 |
28 | endif::backend-html5[]
29 |
30 | // ======================================================================================
31 |
32 | include::getting-started.adoc[]
33 |
34 | include::{dataflow-asciidoc}/applications.adoc[]
35 |
36 | include::{dataflow-asciidoc}/architecture.adoc[]
37 |
38 | include::configuration.adoc[]
39 |
40 | include::{dataflow-asciidoc}/shell.adoc[]
41 |
42 | include::{dataflow-asciidoc}/streams.adoc[]
43 |
44 | include::{dataflow-asciidoc}/tasks.adoc[]
45 |
46 | include::cf-tasks.adoc[]
47 |
48 | include::{dataflow-asciidoc}/dashboard.adoc[]
49 |
50 | include::api-guide-link.adoc[]
51 |
52 | include::appendix.adoc[]
53 |
54 |
55 | // ======================================================================================
56 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/asciidoc/overview.adoc:
--------------------------------------------------------------------------------
1 | streams[[spring-cloud-data-flow-overview]]
2 | == Spring Cloud Data Flow
3 | Spring Cloud Data Flow is a cloud-native orchestration service for composable microservice applications on modern runtimes.
4 | With Spring Cloud Data Flow, developers can create and orchestrate data pipelines for common use cases such as data ingest,
5 | real-time analytics, and data import/export.
6 |
7 | The Spring Cloud Data Flow architecture consists of a server that deploys http://docs.spring.io/spring-cloud-dataflow/docs/{scdf-core-version}/reference/htmlsingle/#streams[Streams]
8 | and http://docs.spring.io/spring-cloud-dataflow/docs/{scdf-core-version}/reference/htmlsingle/#spring-cloud-task-overview[Tasks].
9 | Streams and Tasks are defined using a http://docs.spring.io/spring-cloud-dataflow/docs/{scdf-core-version}/reference/html/_dsl_syntax.html[DSL]
10 | or visually through the browser based designer UI. Streams and Tasks are based on http://cloud.spring.io/spring-cloud-stream/[Spring Cloud Stream]
11 | and http://cloud.spring.io/spring-cloud-task/[Spring Cloud Task] programming models respectively.
12 |
13 | For more details about the core architecture components and the supported features, please review Spring Cloud Data Flow's
14 | http://docs.spring.io/spring-cloud-dataflow/docs/{scdf-core-version}/reference/htmlsingle/[core reference guide].
15 | There're several https://github.com/spring-cloud/spring-cloud-dataflow-samples[samples] available for reference.
16 |
17 | [[spring-cloud-stream-overview]]
18 | == Spring Cloud Stream
19 | Spring Cloud Stream is a framework for building message-driven microservice applications. Spring Cloud Stream builds upon
20 | Spring Boot to create standalone, production-grade Spring applications, and uses Spring Integration to provide connectivity
21 | to message brokers. It provides opinionated configuration of middleware from several vendors, introducing the concepts of
22 | persistent publish-subscribe semantics, consumer groups, and partitions.
23 |
24 | For more details about the core framework components and the supported features, please review Spring Cloud Stream's
25 | http://docs.spring.io/spring-cloud-stream/docs/{scst-core-version}/reference/htmlsingle/[reference guide].
26 |
27 | There's a rich ecosystem of Spring Cloud Stream http://docs.spring.io/spring-cloud-stream-app-starters/docs/{scst-starters-core-version}/reference/htmlsingle[Application-Starters]
28 | that can be used either as standalone microservice applications or in Spring Cloud Data Flow. For convenience, we have
29 | generated RabbitMQ and Apache Kafka variants of these application-starters that are available for use from http://repo.spring.io/libs-snapshot/org/springframework/cloud/stream/app/[Maven Repo]
30 | and https://hub.docker.com/r/springcloudstream/[Docker Hub] as maven artifacts and docker images, respectively.
31 |
32 | Do you have a requirement to develop custom applications? No problem. Refer to this guide to create
33 | http://docs.spring.io/spring-cloud-stream-app-starters/docs/{scst-starters-core-version}/reference/htmlsingle/#_creating_custom_artifacts[custom stream applications].
34 | There're several https://github.com/spring-cloud/spring-cloud-stream-samples[samples] available for reference.
35 |
36 | [[spring-cloud-task-overview]]
37 | == Spring Cloud Task
38 |
39 | Spring Cloud Task makes it easy to create short-lived microservices. We provide capabilities that allow short-lived JVM
40 | processes to be executed on demand in a production environment.
41 |
42 | For more details about the core framework components and the supported features, please review Spring Cloud Task's
43 | http://docs.spring.io/spring-cloud-task/docs/{sct-core-version}/reference/htmlsingle/[reference guide].
44 |
45 | There's a rich ecosystem of Spring Cloud Task http://docs.spring.io/spring-cloud-task-app-starters/docs/{sct-starters-core-version}/reference/htmlsingle[Application-Starters]
46 | that can be used either as standalone microservice applications or in Spring Cloud Data Flow. For convenience, the generated
47 | application-starters are available for use from http://repo.spring.io/libs-snapshot/org/springframework/cloud/task/app/[Maven Repo].
48 | There are several https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples[samples] available for reference.
49 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/css/highlight.css:
--------------------------------------------------------------------------------
1 | /*
2 | code highlight CSS resemblign the Eclipse IDE default color schema
3 | @author Costin Leau
4 | */
5 |
6 | .hl-keyword {
7 | color: #7F0055;
8 | font-weight: bold;
9 | }
10 |
11 | .hl-comment {
12 | color: #3F5F5F;
13 | font-style: italic;
14 | }
15 |
16 | .hl-multiline-comment {
17 | color: #3F5FBF;
18 | font-style: italic;
19 | }
20 |
21 | .hl-tag {
22 | color: #3F7F7F;
23 | }
24 |
25 | .hl-attribute {
26 | color: #7F007F;
27 | }
28 |
29 | .hl-value {
30 | color: #2A00FF;
31 | }
32 |
33 | .hl-string {
34 | color: #2A00FF;
35 | }
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/css/manual-multipage.css:
--------------------------------------------------------------------------------
1 | @IMPORT url("manual.css");
2 |
3 | body.firstpage {
4 | background: url("../images/background.png") no-repeat center top;
5 | }
6 |
7 | div.part h1 {
8 | border-top: none;
9 | }
10 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/css/manual-singlepage.css:
--------------------------------------------------------------------------------
1 | @IMPORT url("manual.css");
2 |
3 | body {
4 | background: url("../images/background.png") no-repeat center top;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/css/manual.css:
--------------------------------------------------------------------------------
1 | @IMPORT url("highlight.css");
2 |
3 | html {
4 | padding: 0pt;
5 | margin: 0pt;
6 | }
7 |
8 | body {
9 | color: #333333;
10 | margin: 15px 30px;
11 | font-family: Helvetica, Arial, Freesans, Clean, Sans-serif;
12 | line-height: 1.6;
13 | -webkit-font-smoothing: antialiased;
14 | }
15 |
16 | code {
17 | font-size: 16px;
18 | font-family: Consolas, "Liberation Mono", Courier, monospace;
19 | }
20 |
21 | :not(a)>code {
22 | color: #6D180B;
23 | }
24 |
25 | :not(pre)>code {
26 | background-color: #F2F2F2;
27 | border: 1px solid #CCCCCC;
28 | border-radius: 4px;
29 | padding: 1px 3px 0;
30 | text-shadow: none;
31 | white-space: nowrap;
32 | }
33 |
34 | body>*:first-child {
35 | margin-top: 0 !important;
36 | }
37 |
38 | div {
39 | margin: 0pt;
40 | }
41 |
42 | hr {
43 | border: 1px solid #CCCCCC;
44 | background: #CCCCCC;
45 | }
46 |
47 | h1,h2,h3,h4,h5,h6 {
48 | color: #000000;
49 | cursor: text;
50 | font-weight: bold;
51 | margin: 30px 0 10px;
52 | padding: 0;
53 | }
54 |
55 | h1,h2,h3 {
56 | margin: 40px 0 10px;
57 | }
58 |
59 | h1 {
60 | margin: 70px 0 30px;
61 | padding-top: 20px;
62 | }
63 |
64 | div.part h1 {
65 | border-top: 1px dotted #CCCCCC;
66 | }
67 |
68 | h1,h1 code {
69 | font-size: 32px;
70 | }
71 |
72 | h2,h2 code {
73 | font-size: 24px;
74 | }
75 |
76 | h3,h3 code {
77 | font-size: 20px;
78 | }
79 |
80 | h4,h1 code,h5,h5 code,h6,h6 code {
81 | font-size: 18px;
82 | }
83 |
84 | div.book,div.chapter,div.appendix,div.part,div.preface {
85 | min-width: 300px;
86 | max-width: 1200px;
87 | margin: 0 auto;
88 | }
89 |
90 | p.releaseinfo {
91 | font-weight: bold;
92 | margin-bottom: 40px;
93 | margin-top: 40px;
94 | }
95 |
96 | div.authorgroup {
97 | line-height: 1;
98 | }
99 |
100 | p.copyright {
101 | line-height: 1;
102 | margin-bottom: -5px;
103 | }
104 |
105 | .legalnotice p {
106 | font-style: italic;
107 | font-size: 14px;
108 | line-height: 1;
109 | }
110 |
111 | div.titlepage+p,div.titlepage+p {
112 | margin-top: 0;
113 | }
114 |
115 | pre {
116 | line-height: 1.0;
117 | color: black;
118 | }
119 |
120 | a {
121 | color: #4183C4;
122 | text-decoration: none;
123 | }
124 |
125 | p {
126 | margin: 15px 0;
127 | text-align: left;
128 | }
129 |
130 | ul,ol {
131 | padding-left: 30px;
132 | }
133 |
134 | li p {
135 | margin: 0;
136 | }
137 |
138 | div.table {
139 | margin: 1em;
140 | padding: 0.5em;
141 | text-align: center;
142 | }
143 |
144 | div.table table,div.informaltable table {
145 | display: table;
146 | width: 100%;
147 | }
148 |
149 | div.table td {
150 | padding-left: 7px;
151 | padding-right: 7px;
152 | }
153 |
154 | .sidebar {
155 | line-height: 1.4;
156 | padding: 0 20px;
157 | background-color: #F8F8F8;
158 | border: 1px solid #CCCCCC;
159 | border-radius: 3px 3px 3px 3px;
160 | }
161 |
162 | .sidebar p.title {
163 | color: #6D180B;
164 | }
165 |
166 | pre.programlisting,pre.screen {
167 | font-size: 15px;
168 | padding: 6px 10px;
169 | background-color: #F8F8F8;
170 | border: 1px solid #CCCCCC;
171 | border-radius: 3px 3px 3px 3px;
172 | clear: both;
173 | overflow: auto;
174 | line-height: 1.4;
175 | font-family: Consolas, "Liberation Mono", Courier, monospace;
176 | }
177 |
178 | table {
179 | border-collapse: collapse;
180 | border-spacing: 0;
181 | border: 1px solid #DDDDDD !important;
182 | border-radius: 4px !important;
183 | border-collapse: separate !important;
184 | line-height: 1.6;
185 | }
186 |
187 | table thead {
188 | background: #F5F5F5;
189 | }
190 |
191 | table tr {
192 | border: none;
193 | border-bottom: none;
194 | }
195 |
196 | table th {
197 | font-weight: bold;
198 | }
199 |
200 | table th,table td {
201 | border: none !important;
202 | padding: 6px 13px;
203 | }
204 |
205 | table tr:nth-child(2n) {
206 | background-color: #F8F8F8;
207 | }
208 |
209 | td p {
210 | margin: 0 0 15px 0;
211 | }
212 |
213 | div.table-contents td p {
214 | margin: 0;
215 | }
216 |
217 | div.important *,div.note *,div.tip *,div.warning *,div.navheader *,div.navfooter *,div.calloutlist *
218 | {
219 | border: none !important;
220 | background: none !important;
221 | margin: 0;
222 | }
223 |
224 | div.important p,div.note p,div.tip p,div.warning p {
225 | color: #6F6F6F;
226 | line-height: 1.6;
227 | }
228 |
229 | div.important code,div.note code,div.tip code,div.warning code {
230 | background-color: #F2F2F2 !important;
231 | border: 1px solid #CCCCCC !important;
232 | border-radius: 4px !important;
233 | padding: 1px 3px 0 !important;
234 | text-shadow: none !important;
235 | white-space: nowrap !important;
236 | }
237 |
238 | .note th,.tip th,.warning th {
239 | display: none;
240 | }
241 |
242 | .note tr:first-child td,.tip tr:first-child td,.warning tr:first-child td
243 | {
244 | border-right: 1px solid #CCCCCC !important;
245 | padding-top: 10px;
246 | }
247 |
248 | div.calloutlist p,div.calloutlist td {
249 | padding: 0;
250 | margin: 0;
251 | }
252 |
253 | div.calloutlist>table>tbody>tr>td:first-child {
254 | padding-left: 10px;
255 | width: 30px !important;
256 | }
257 |
258 | div.important,div.note,div.tip,div.warning {
259 | margin-left: 0px !important;
260 | margin-right: 20px !important;
261 | margin-top: 20px;
262 | margin-bottom: 20px;
263 | padding-top: 10px;
264 | padding-bottom: 10px;
265 | }
266 |
267 | div.toc {
268 | line-height: 1.2;
269 | }
270 |
271 | dl,dt {
272 | margin-top: 1px;
273 | margin-bottom: 0;
274 | }
275 |
276 | div.toc>dl>dt {
277 | font-size: 32px;
278 | font-weight: bold;
279 | margin: 30px 0 10px 0;
280 | display: block;
281 | }
282 |
283 | div.toc>dl>dd>dl>dt {
284 | font-size: 24px;
285 | font-weight: bold;
286 | margin: 20px 0 10px 0;
287 | display: block;
288 | }
289 |
290 | div.toc>dl>dd>dl>dd>dl>dt {
291 | font-weight: bold;
292 | font-size: 20px;
293 | margin: 10px 0 0 0;
294 | }
295 |
296 | tbody.footnotes * {
297 | border: none !important;
298 | }
299 |
300 | div.footnote p {
301 | margin: 0;
302 | line-height: 1;
303 | }
304 |
305 | div.footnote p sup {
306 | margin-right: 6px;
307 | vertical-align: middle;
308 | }
309 |
310 | div.navheader {
311 | border-bottom: 1px solid #CCCCCC;
312 | }
313 |
314 | div.navfooter {
315 | border-top: 1px solid #CCCCCC;
316 | }
317 |
318 | .title {
319 | margin-left: -1em;
320 | padding-left: 1em;
321 | }
322 |
323 | .title>a {
324 | position: absolute;
325 | visibility: hidden;
326 | display: block;
327 | font-size: 0.85em;
328 | margin-top: 0.05em;
329 | margin-left: -1em;
330 | vertical-align: text-top;
331 | color: black;
332 | }
333 |
334 | .title>a:before {
335 | content: "\00A7";
336 | }
337 |
338 | .title:hover>a,.title>a:hover,.title:hover>a:hover {
339 | visibility: visible;
340 | }
341 |
342 | .title:focus>a,.title>a:focus,.title:focus>a:focus {
343 | outline: 0;
344 | }
345 |
346 | .mediaobject img {
347 | max-width: 100%;
348 | }
349 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/background.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/caution.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/caution.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/cover.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/important.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/important.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/logo.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
17 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/note.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/note.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/tip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/tip.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/warning.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spring-attic/spring-cloud-dataflow-server-cloudfoundry/ee6a79bbadf696e5a98ce6c2b3c8f85914e27df4/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/images/warning.png
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/xsl/common.xsl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
22 |
27 |
28 |
29 | 1
30 | 0
31 | 1
32 |
33 |
34 |
35 | images/
36 | .png
37 |
38 |
39 | book toc,title
40 | 3
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/xsl/epub.xsl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
22 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/xsl/html-multipage.xsl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
22 |
24 |
25 |
26 |
27 |
28 | css/manual-multipage.css
29 |
30 | '5'
31 | '1'
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | firstpage
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/xsl/html-singlepage.xsl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
22 |
24 |
25 |
26 |
27 |
28 | css/manual-singlepage.css
29 |
30 |
31 |
--------------------------------------------------------------------------------
/spring-cloud-dataflow-server-cloudfoundry-docs/src/main/docbook/xsl/html.xsl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
22 |
27 |
28 |
29 |
30 |
31 |
32 | 1
33 |
34 |
35 | 1
36 |
37 |
38 |
39 | 120
40 | images/callouts/
41 | .png
42 |
43 |
44 | text/css
45 |
46 | text-align: left
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 | ,
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |