From c2aa95b1bdd7818dfff429637f4c9ff5c51bb1c3 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 15:26:30 +0200 Subject: [PATCH 01/27] ui application dependencies revamp --- .github/workflows/build.yml | 40 +++++++++++++++++++ .circleci/config.yml => config.yml | 0 ui/{src/main/docker => }/Dockerfile | 2 +- ui/pom.xml | 33 ++------------- .../it/valeriovaudi/ui/UiApplication.java | 8 ++-- 5 files changed, 49 insertions(+), 34 deletions(-) create mode 100644 .github/workflows/build.yml rename .circleci/config.yml => config.yml (100%) rename ui/{src/main/docker => }/Dockerfile (70%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..e94addf --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,40 @@ +name: build + +on: + push: { } + workflow_dispatch: { } + +jobs: + build-ui: + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + + - name: install openjdk + run: | + sudo apt-get update && sudo apt-get install openjdk-17-jdk + sudo update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java + sudo update-alternatives --set javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac + java -version + + - name: Build + run: | + export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 + export PATH=$JAVA_HOME/bin:$PATH + cd ui + mvn clean install -q + + - name: docker push + run: | + cd ui + if [[ ${GITHUB_REF##*/} == 'master' ]] + then + DOCKER_TAG="latest" + else + DOCKER_TAG="${GITHUB_REF##*/}" + fi + echo "$DOCKER_TAG" + docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }} + docker build . -t mrflick72/ui-interface:$DOCKER_TAG + docker push mrflick72/ui-interface:$DOCKER_TAG \ No newline at end of file diff --git a/.circleci/config.yml b/config.yml similarity index 100% rename from .circleci/config.yml rename to config.yml diff --git a/ui/src/main/docker/Dockerfile b/ui/Dockerfile similarity index 70% rename from ui/src/main/docker/Dockerfile rename to ui/Dockerfile index 1b0a8a1..2cda6c6 100644 --- a/ui/src/main/docker/Dockerfile +++ b/ui/Dockerfile @@ -1,6 +1,6 @@ FROM openjdk:11 -ADD ui-interface.jar /usr/local/ui-interface/ +ADD target/ui-interface.jar /usr/local/ui-interface/ WORKDIR /usr/local/ui-interface/ diff --git a/ui/pom.xml b/ui/pom.xml index a1260f7..0522958 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -5,18 +5,18 @@ org.springframework.boot spring-boot-starter-parent - 2.4.3 + 2.7.4 it.valeriovaudi ui - 0.0.1-SNAPSHOT + 1.0.0-SNAPSHOT ui Demo project for Spring Boot - 11 - 2020.0.1 + 17 + 2021.0.4 @@ -136,31 +136,6 @@ - - - com.spotify - docker-maven-plugin - 1.2.1 - - mrflick72/ui-interface:latest - src/main/docker - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - - - - javax.activation - activation - 1.1.1 - - - diff --git a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java index 5a70554..9728232 100644 --- a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java +++ b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java @@ -3,7 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.context.annotation.Configuration; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.User; @@ -21,7 +21,7 @@ public static void main(String[] args) { } -@EnableWebFluxSecurity +@Configuration(proxyBeanMethods = false) class SecurityConfig { @@ -38,13 +38,13 @@ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) @Bean public MapReactiveUserDetailsService userDetailsService() { - UserDetails user = User.withDefaultPasswordEncoder() + UserDetails user = User.builder() .username("user") .password("secret") .roles("USER") .build(); - UserDetails admin = User.withDefaultPasswordEncoder() + UserDetails admin = User.builder() .username("admin") .password("secret") .roles("ADMIN") From 5aa2a625fd104d1235ea103e98a9ec168aa54cc9 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 15:33:19 +0200 Subject: [PATCH 02/27] ui application dependencies revamp --- ui/src/main/frontend/app/site/MainSiteApp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/frontend/app/site/MainSiteApp.js b/ui/src/main/frontend/app/site/MainSiteApp.js index d35142f..5dbd67a 100644 --- a/ui/src/main/frontend/app/site/MainSiteApp.js +++ b/ui/src/main/frontend/app/site/MainSiteApp.js @@ -36,7 +36,7 @@ export default class MainSiteApp extends React.Component { let bottomSection =

{this.state.message}

return - + Date: Fri, 30 Sep 2022 15:41:34 +0200 Subject: [PATCH 03/27] message-service application dependencies revamp --- .github/workflows/build.yml | 33 +++++++++ .../{src/main/docker => }/Dockerfile | 0 message-service/build.gradle | 68 ------------------- message-service/build.gradle.kts | 51 ++++++++++++++ .../{settings.gradle => settings.gradle.kts} | 0 5 files changed, 84 insertions(+), 68 deletions(-) rename message-service/{src/main/docker => }/Dockerfile (100%) delete mode 100644 message-service/build.gradle create mode 100644 message-service/build.gradle.kts rename message-service/{settings.gradle => settings.gradle.kts} (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e94addf..b417065 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,4 +37,37 @@ jobs: echo "$DOCKER_TAG" docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }} docker build . -t mrflick72/ui-interface:$DOCKER_TAG + docker push mrflick72/ui-interface:$DOCKER_TAG + build-message-service: + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + + - name: install openjdk + run: | + sudo apt-get update && sudo apt-get install openjdk-17-jdk + sudo update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java + sudo update-alternatives --set javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac + java -version + + - name: Build + run: | + export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 + export PATH=$JAVA_HOME/bin:$PATH + cd message-service + mvn clean install -q + + - name: docker push + run: | + cd message-service + if [[ ${GITHUB_REF##*/} == 'master' ]] + then + DOCKER_TAG="latest" + else + DOCKER_TAG="${GITHUB_REF##*/}" + fi + echo "$DOCKER_TAG" + docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }} + docker build . -t mrflick72/ui-interface:$DOCKER_TAG docker push mrflick72/ui-interface:$DOCKER_TAG \ No newline at end of file diff --git a/message-service/src/main/docker/Dockerfile b/message-service/Dockerfile similarity index 100% rename from message-service/src/main/docker/Dockerfile rename to message-service/Dockerfile diff --git a/message-service/build.gradle b/message-service/build.gradle deleted file mode 100644 index 3532b89..0000000 --- a/message-service/build.gradle +++ /dev/null @@ -1,68 +0,0 @@ -plugins { - id 'org.springframework.boot' version '2.4.3' - id 'org.jetbrains.kotlin.jvm' version '1.4.30' - id 'org.jetbrains.kotlin.plugin.spring' version '1.4.30' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - - id "com.palantir.docker" version "0.21.0" -} - -apply plugin: 'io.spring.dependency-management' - -group = 'it.valeriovaudi' -java.sourceCompatibility = JavaVersion.VERSION_11 - -repositories { - mavenCentral() -} - -ext { - set('springCloudVersion', "2020.0.1") -} - -dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter' - - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-all' - - implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive' - implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'org.springframework.boot:spring-boot-starter-actuator' - - implementation 'com.fasterxml.jackson.module:jackson-module-kotlin' - implementation 'org.jetbrains.kotlin:kotlin-reflect' - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'io.projectreactor:reactor-test' -} - - -dependencyManagement { - imports { - mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" - } -} - -compileKotlin { - kotlinOptions { - freeCompilerArgs = ['-Xjsr305=strict'] - jvmTarget = '11' - } -} - -compileTestKotlin { - kotlinOptions { - freeCompilerArgs = ['-Xjsr305=strict'] - jvmTarget = '11' - } -} - - -docker { - name 'mrflick72/message-service:latest' - dockerfile file('src/main/docker/Dockerfile') - copySpec.from("build/libs/message-service.jar").into("message-service.jar") - pull true - noCache true -} \ No newline at end of file diff --git a/message-service/build.gradle.kts b/message-service/build.gradle.kts new file mode 100644 index 0000000..7296c47 --- /dev/null +++ b/message-service/build.gradle.kts @@ -0,0 +1,51 @@ +plugins { + id("org.springframework.boot") version "2.7.4" + id("io.spring.dependency-management") version "1.0.14.RELEASE" + kotlin("jvm") version "1.6.21" + kotlin("plugin.spring") version "1.6.21" +} + +group = 'it.valeriovaudi' +java.sourceCompatibility = JavaVersion.VERSION_17 + +repositories { + mavenCentral() +} + +extra["springCloudVersion"] = "2021.0.4" + + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter' + + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-all' + + implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive' + implementation 'org.springframework.boot:spring-boot-starter-webflux' + implementation 'org.springframework.boot:spring-boot-starter-actuator' + + implementation 'com.fasterxml.jackson.module:jackson-module-kotlin' + implementation 'org.jetbrains.kotlin:kotlin-reflect' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'io.projectreactor:reactor-test' +} + + +dependencyManagement { + imports { + mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}") + } +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = listOf("-Xjsr305=strict") + jvmTarget = "17" + } +} + +tasks.withType { + useJUnitPlatform() +} \ No newline at end of file diff --git a/message-service/settings.gradle b/message-service/settings.gradle.kts similarity index 100% rename from message-service/settings.gradle rename to message-service/settings.gradle.kts From 0a48aa96d247040653f1945764c5e22be55c6369 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 15:43:59 +0200 Subject: [PATCH 04/27] message-service application dependencies revamp --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b417065..a170363 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,7 +56,7 @@ jobs: export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH cd message-service - mvn clean install -q + ./gradlew build - name: docker push run: | From fd45997340f3da749ce2a24c08a29c4dc61314f9 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 15:46:06 +0200 Subject: [PATCH 05/27] message-service application dependencies revamp --- message-service/settings.gradle.kts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/message-service/settings.gradle.kts b/message-service/settings.gradle.kts index 158ae85..c8f9f89 100644 --- a/message-service/settings.gradle.kts +++ b/message-service/settings.gradle.kts @@ -1,6 +1 @@ -pluginManagement { - repositories { - gradlePluginPortal() - } -} -rootProject.name = 'message-service' +rootProject.name = 'message-service' \ No newline at end of file From ac222ec92c42cedc9ad1ee3e43ec26de68e03434 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 16:00:29 +0200 Subject: [PATCH 06/27] message-service application dependencies revamp hello-service gradle dependencies upgrade --- .../gradle/wrapper/gradle-wrapper.jar | Bin 55190 -> 60756 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- hello-service/gradlew | 288 +++++++++++------- hello-service/gradlew.bat | 175 ++++++----- message-service/build.gradle.kts | 23 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 55190 -> 60756 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- message-service/gradlew | 288 +++++++++++------- message-service/gradlew.bat | 57 ++-- message-service/settings.gradle.kts | 2 +- 10 files changed, 493 insertions(+), 344 deletions(-) diff --git a/hello-service/gradle/wrapper/gradle-wrapper.jar b/hello-service/gradle/wrapper/gradle-wrapper.jar index 87b738cbd051603d91cc39de6cb000dd98fe6b02..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 27883 zcmaHyV{l->*XA=ZC$?>ylZkEHwteG?ZQD*Jp4hf++Y{`(|97jl-mR_ubi3~DuKS_u zIp_SIKAlnvwy*|PNBa#{!KppH5(Wf>9wRZDlojwm8%Fj62Rb0(%_(rM-d3_f>$c<^E`r_RITz3qDrhcE%LMdXNNSTBROhS}A{T)yX3UFQ;7dtJsXE~}TB~@g z)hQS8NBjHp$nGP})gUff=WHzJ>#Z3&sJ-Hi8oH}TW`tI!ZZEG2T{7s^ATRpH@o+kAy&psb+_ihGRD& zg4ba+me#3X{KG?|m-O!5*y(nkMj${wWmoy7DR5e1O1xMi;YZ~3=V|X_|Z_ba^FCy?D z6yX)OeVW3Cw3)JyMq2QEfMZNy0-3k(#k0)i0p8@2)Z3Iqo{re*LwYUVVjm#WeLEdH zE3U^ki}Fhmnan4)ya27G3eFb2s+3S(o5uQ(TqpZNVf+MZ(?NN9V*Lm`j|r@0=6dT9 z6o40@Ik0uGOLH=3+54T(r{$+pIhSHeTM3U|_gW|;Z)rloz8AW=(ovge9Y{q#M(maw zz5bRSWqbf*X1Zb5$X-E-VharIxUpgrTC~tXg{5ycZvjTB0()fLfwgc|2(tKFpvo*YK61T3wdv7W2>C>s(o6Rhl?i9+5I1phK(&QIQ$h<3#K22=2ynUr z>`}hn=SNL4FMzl^Fs-={6Dh!Y6LhX0gVY>=W z;78uAi`3^%Y-7q-3|S?k)?|6zlcElRK&%~N3mJ-7l%}y{*Y@b{Gw3*fT1&kJxs4o| zo($J={*RqlP%SrtS%BRA_-wSDa`02KH<$e#0$9A^#NO!MuLuQpXwC;NC*Z8Z1vRHq zfIWSu?QV3wn%y5BLcIVx4;dP>Fsf)@X_%30l0yW2JNkB8oAeGCX-k@|)8y!@U8`+t~Crrg6 zJR{0x2Ye)Ti0*?(tZF=|il;)Vq7!)<@@5+X5+T@d*yW#xYYNW-yS4tm4I(xIdY(^lq;_<-k2IJ0iawk%541e7GKuqA%epEk z32jP;j&)hCCFxhDv$S{G;RHuEO71W-#<5AKR^swpIdmuvICMcv90v5OVrk?nN_N2TEx#1T5uD= z{NmcO(J>!fcV97h0)SQsOxeI;|r#u^Jn zOJxZAWtWxI_`i0rT8WYH2BY`O&Png7Fk+2Hxl)vt8qiYYy}D4p#f-zagmolvO6XkM_eK za<94IQBqy<*+!BKg$>~IgHm+AVo5^r2x*GG>&mDI`O<xpshJ>C^isJu zUkIXa)(DsGE6kwpr-2^R?s1U;-7!4h%kPNO)H;Z>^-bXqq@K4!I_codO*PYlzEhFJ zBhMxrWzt?2rK!Ga<6FR2N$!>?R!w5IP)cuXL~#iy&F>MA`m?^QqbewCr1rg`aTGb+ z+ddnbdEjNfsYUIj(5lR$S;!gQ^QTdU2Wb1I))m*5<$J?xi{BQ}23H&cB+W27(4~`B zxT1d{#GN3NElBMK-AI&i$Da+_*F9Vomfm=f_(J zU>T1@frC|wbctj|iBwWy(cH<<#Kx4~-O13w!PJS~!O+Rj z*3{+S$nM|MnZd!y{@-gCOH*gCe=8a{%|nq9$k5HarNKZzy8qRWyorvvWQnFTIEgi$ zFaR}w9le4A(sdYmK7A7ea-F|WawHn;Psy9@X5Dk4Rq}OFABfyO^&XKRDWmt&+w>^M zDZ2n8?Pe^LudMNjEc-5QURH0v&(Ayb9wId|Hqto>VHF`b5)>n>2P5cbu2AkPxXCi` z80Hu#ynU3;v?QWk;$hMlYRK4EDSGe%cwkd3! z&}d-POJ`BVIl-`bdG*~MPCAReKJvMmxfRt*&CmilusFNA$%rp;-ZPrcAzIIOxd0RSVM zSW}(RU|7;DtGdjE0$=^K<|ZnYSf}?u!FjOkM8;^{Hd0|(rp2JgaO!NP7b=T)Wo5JBc8Ls#6Gof>ii;86gP@zjjh#N zjT$i_Pi47JYlL;+3JG~bVNeLo4gMn92RlVtwxEhuvGz}ENqFkeU7(^~%cy~0?s6>D ziKWCUqPGzf;jqgYBRd1U8Tl|hYm_QP$bd~slSf6^@L|=o-MHcvS~a<>4nPH^InFX- zc}Q}LQt=WVP5WgoEs8h3&>|Q7)T~s?{mY5YmghIdwUDfDty&Y|)U!7UAP>gC(fZ}e zyxW*p5b1Y9|8Q>Z*KMKRR1qZY!Z;%z@8;Z8Teyk|?;A{u1$$k1#eb=5QChEgvO;&Z ziq~mFfKPT#gul9vQUkIS0la-5#i~i<#C^p7L$tvr5B{U)5$5W~e4*n8A*cBB+JYBE zA2Gg!c;soe)g8q017zz_A+5RVQ&@C9M^tUb0@c69yS@zEmQq}W!U1km zIS1sFpSUsj0rK7g2{Ea-4PC-YRb};S`!QBCJ15BW|T@l3JZ&xCaU2j<; z4c9LFKqnviD;x+2-+y$*IExDms+~Kns~~;GR3Ef9%<+^+ z;u7sZmP-1BJ6mV2SV|}8h2vswKxR25qA!-!7st@ecY((CXeVK(p|Q+-2JPZ|pkX~p z*cmO$9WZ6@PPbjGHvYXV<*)p>&(-$>WBT=rMb7vZ96_2Tv~DCmk=RgE3?sF_HLwzo zFk%vRxIzKwpb#E%jlm_}IA|r`=MYF>_IHixjH2S;g2i*ke#^Fx^708aq_ba5mKjuQ zsq_-7#7SqbR8yY3>@+-cSM8`-=bqE!km+yhb8w#1|8PZ6@7yd%&0I5yTdK0n-c3TX zVY4#b>?%#EBnv;Hm#wy|XeNG=%_rMofv-M8q}K+z4Od)CSEx8`S*TiMm0Ol8tp3y_ zt`#tjc&H1bS!(bqTnfpV)4_wKXu7DZQ}emOj~~1Q8_sBZcb&`-YilRIil4Pul~iOT z%gojzG$x!U$-D|**U4f9R_G!xxULl1o437*B(&Uox6rm&H}i7swD+hBsSuhUR$M(e zh3*5Oe>Xde`(F6z#E|q);f~UNA(?G%!0}}x_g7&ZVeS3dFpi5<>tCWW7ZLjIej)>R zg`PDS7HF8Y+d3R4fKj@4=L?bflC;kXL2ko5@cyE51Cq;1_v+Pdf0ed`+9++7!+#;s z%N+%yqR&i*=w4@}j>Ep`QuAZ+!HgiwIwJ~TcP7&%|C5&LUmt$^Hozu)K%@zGDBgbL z;8QIqs_C(S#qb*1B6zlj*EOM`*=rR{hE5qIo#7;bfb>HnQKjrY^KRQxEnMw}w1 zbf9iaS@i5takQf3^wG=5F_d802l3i-?0(T9$|^J>fC}Cgw89E~(~xT$c78lb-CY|H zg@R5254_bwvT;Pp-Q{rWJ|7yxrQ)xK=unp)|90rMD2oQ*=v2k;rX&vddEqPqOFT= zi|vVn=M?^UWc2`HL>`kOox4tZ9H8tHcR_TbmRxrTd`LF;#-b9Hm+IbAp-y8E5I4aL zVthiPFBUIS*Rtn#218NUCQUVv24{^_OzFqc7K_joi_tA^c32GQ+6h?uRbvEzCW32L zl~|w)ruiws6pb8F)euKpT1m0m#RYW7@5gZom68&HnrG%?NT?U2cWl&yUA=`Eavbx> zdC>fg;r`uYt}~2x&){wJ+aK;~x$R`FHTc<5Pc*E{Af*qENbbIs?CpRqVd48Uv~oO> zNNy+OEQGluR6*|4o-wsQqs1q*QoW-s3QBOq>PSwD4i!!?UF(OOW-${&?wOrxGmbcyd?#flJk+~X$aRCrvIt2O_PL~MmD(whxT>LD6w-dVjG^t4@hAcmun`orH`Kj zwD+hBi~Di#7A8be4bM0&n+w+?Dd+U5k)Ft*>39&z<%L(!Z}I9t!YN6Z1L7pc@YJ1M zVWv@k*9tL$foDXX^L)!y#a~jgY;I_&%vz6cj#68 zl|46MB5mM~+o)}s7P?O1kmnbwM|)Kc?8T&~-y-;e=6|RCxs*Lf#edox-R@i2%q$vL z!9ZJ6{KmGva}9#!1O@M;`iL`+!|Yp4;rVs92a85QK0TVUYDYOA)P4%9qn&%b6`CH( zQDFM2df14XCK`52zqzJhuxS$$V%EX`rk1LLtfBS8IK45k-8<;$fR4J_zO|nfh@twW z#N%B)A!|d!2L&cEqZXfv{|?Y#EfQHJs(3G6uw&OeL4vH(jM_?Y)I^7-@Hv zc_&r%^@7Tba?m7Etwm)m9SFnuI(PRWfXsKT-p)XW zB~L=f%lau1MToz*CBZFdozd=SospZc-*@;SuARx&+UKd4^Kix++!l~Gmr5t!i3AjG zh_%0v1#%8tyLHff`o4dmnS#0L50vN)tpQWJ3{kkpDd$?W}7N1 zfv_rFt|&t|uBe({w4MBI1K_+2!fEB%;Z#pv<1IK?A}Ciuv7dFPVy2Ouca&hDA*6zW z8R_Ly4@@Yxr@KJ$X=X3nQ+C5cSCOMAm$4dIV5rQ7S;!Yx#a|@l#nWI<(bR0umn7Sl z_Pkj>zp`5XLD%A|;howurA<*nyh=Njp*|Tc7dteC=5HRcOy_Is0Q~nOrz<)QeJkQ6 z5wV9`V@;K)-U6TXRegm&;p!-GD`lM1ks8C|CwI>z2hukvAm{v#ZoC6UGPc~@e1-kA z>gG|yHwu3e*H_xo@;6QGuw}A_d)H2ZH&T2H8(4y>-nA*F=hj_e`8*4f>gK{Z8J5AW z@EDjak0{M*na{g-12SB<EP(mhTL}sYk>N`_LfS8dwZ& z>^qLKcA($M)==Kf)>uZl9#~89qFmw>dB$&Ln7N`)=+oez1(-*?>vynd-YS!3IMWvO zaXwIXw`!UGQcb-vaD|f?`fQADhhA;dtfGT31)Q1YB?g= z?g_g@#PY#a_?~LQdDX!#C)!n>;t7pHz@7Sl@qpQKdaQv-OXRSHHi|RnlE)@GGeu|) zD{M~d2^`Ou0OV$kuY1lak-`dtm^lW6=4jA*m%FgZ{tqrNMZf2!B;p0vC|6g4vE>4t zqDa1x_98;$>RBADBlXJF*^4W3{#4zLKgMt&i-ZFXHN}*y+kF}!9&&K{J+};nPXvb` zj?Dub>Kqh?M$b>|@F+VZFZg(LsBZW%9tSdp9AY zPB$=D&v(3_)_}LibrfNbgu1P)0`&0jiAROy)=9rdDc-{UN$~4;yyf*n0d~|K`|j0~ zd>SI}nltxwBK8m32*y;VrcnbB*XzKn9hKuC;E-an4=9%>DHR!ZQ@RzMQ6k*Ax=~at zS|E1~*FrKefZ7VEaU7a#V4y`ub>&%@RKZ1v4PENZ-jox% z$3>x3J-=*)Q%oZm4(#N`U#ZXdIfi{zILydx|C#7w5t6(jLipqy=xro^{qdjd$2f=6 z=n>jon!v=oj5T zM;nP-z!2lV!($-*qhEU`bH@KBU`AILOB=@jf?NRm|M9`n?jIA|8UELd{|Ve+pZQ~N zpdcWW5dVJv|68bK>7Z<5>A+xYW9aN0qN1%lFNpS;f`KB{3Za5FP)3CG`xcg_jB4*U z5Xkz-lE)~mIcAixU_!f>`2+0JpHZL;apa`z`jcw7F<)qLD(x44$MKWz@!aRj>npB5 zYuaQUazFM(Z`ilx0Y@-O7Orp`NNSHax3K|B`sp+->%FY598Ts6;UO8FksT5Sc4Iu$ zHK)}9bTD=73Y-z3Od2DMmmCz0R^~1_><^AC?On#U zxFR;+6)+p=eCrT91`6MTX50!bq*MCJ2GIKl zd2D?${&obuDOd4=u5k+w%@;Rl6)p`&h(|ycq+m}7VNo%Fk!)(?a{rzv?DSAX{`r%P zwCb<}gI3YVf*SUb2zH!g&awqR!77oyq>Y1b?D|4EIzXejj0v+Q!XjcAV5ikOS1#qk zE78{^eMp6zw-z!-{KJ&SjzJY*X|ASpdki>XW^hCLDXaE`We~TqrY25CgSor5# zU71UQA4ENq1ob5?t$R7bAXMW88R(Q;16E`%h||Zg#rI*}(QrA4>UY3is0Qj$VW4$g zn4Jlorxx3ur>6C{0T7RfKOpz5jbR<%u6Da(WeE{|*dQ=+EDJZC1GFlA8FuiG%TZdf ztqZrJegXWZ(DrhKwqc6o3CH_6On1m+D?X#K;Ec7GMO$Jmr-DQU$? zO$#wSuV9CFRIKJ*=Xgw8a$TqdDZ+8M1FF@0h<}Vp9M4K;mrs$66`hLfn*Tm^U%RGa zT~sqT)u&3v;;vHp6i0z>e_f%d5P`MPp*ScrsRzzc6HPpSE|oh4@jc!$4UpP|+|*Om z30R&oB^oEfC-L*G0rDk}_4r0m9iW%AoD2$Ig%7sZLgZOJYumEP2(u{kb?$@hHoHL_ zmVD?hS}cv+tV>T9CufbMs5ign>OtJw*4k|lEc*6=y}OsTBM&Y@vE>udra(8pFWiCD zGkxxzKMLfC4%zNp-)0zQl~~V|?_g$sH*EYgzM{3tH9t`lwU;AO_B!1ZD)f4;k4ml> zuo~3q=c)d+zS4u>^-WQ4u-E>7ZnWh$x=O--fs*W>VM(7DM~d-ppYecoWmI*nFMQ|K zI=V1sn()ASAxRKa#@}jnYSC0P5cJ<{o7NaciL30~PR$Butgfs7@I42#e8N1Dudw`{ zPjxE+689f?J0vBII(sHo8@C^ybveHTK0cWJ3tuF~Ku}rq`XOL2h0~Il$c=HX$8LTm zGm#pqiNU9u=nQ$Y9K`|X!<|t`7$!Qss*at6LUIZ4?pCNm4pK^MmI*g$Gy9t!iXknhIEm1E`8COH7O{7d0r9TF8 zn?bS_;~o2oP8$LU)d=#ROoh*JpCgDRbLXVAvn|f)l&D-)?k|<>igZfu<}a*nH9~Q5 z;;7F!rj4;nH-%{_w@m3{|S;86kWN+YzrlEVRnv0wfBQ!KIi zF0^R1#*y;5*^%dF**Y_$rCl1x7<`3 z0+rU4R3QNU9cc*tUF)+VuQ}FG)uVzg*sfj!e4T0>wn!EDZwJ~C+q(gQ*SG#97wEri zcESP)Z%F%RXla-p1Zn}xyJii9!wbu7F)cFb6x}(C26>8{?8Twm$1^qi*`x5SMKSfN z0Doip3EB8Wh1$ErBC65f9_zZ5cbCO%4ChMUSkj9iU+=Zxp~E) zW1)G~hNQ{scDl1DDM#*3^qjFQ)4giFvzXqB|0bciEWWJFlbI17N_$D?uNlmp>KdNu zb0Xjtov+NuN!R>6$U{ierzK-DT}zUV?>1Yi`9d5o577f;ZyJgsg&@0jUOOWvDkoqU zp-%s_0YTUWQr8F#h6i09L=t{J(Ga|lOmyr5oa_ziDpsJcc~$r;&mFZ(XXW|}EFjCC z?JsmMf&^ekl0>Q`KIL8p+ZG{bM5XFtn+JGLd_k`le$sdqeBQ*+^ce?O5OpRNk#g&M zs5eJ!8uwbnd18p4_)agDeK9`N2*ysL>}=+Xm*j=!UW{%ThK!}a zm90`vwP+P5SPJvR3`!#ulej_D?nnt~PR-|Z3<;Y+SOS8GiuH{T{0V#*nrqZ#ql-)a z6wGAr+Fd#13nbAR@)p6fNxO#)90X(q>fdS4eq^!n$Sw5&XCa>JWCN}xFI;zqfJrZ!Rus5aAr&r3uDQE zo5toa*n=iKa7%-}%j$x`*PT%Q(s>a!Q8AsG8j?#*WuB6sPlu~|=zXS@?(nHh^WNTin-vPeNcyw#3p;yd~LCaYN-4pO?Tg8qGyNeZh z{?1UhJfDQCCl(2Z?X_4pd20B&2X>-K*jmaVnLZ)rI>;t9vd4|6s7i^wVT7hH$%NeX(Ih1-dTcqpNbxhyYddi#%clfc7E$`6O2DNg9kRF zEbYnW3ZPmieX4M_TsHam_!u#H^L^CtD3w3Kt~JucX8T~WfToi+&&8go5bHE{CQAP6 zx%#W0nY&?Ht|up~^X!~;sRPZ*BvZH^(|vzi?RLR*IB$rBp8%C?k?S2<`VBO4p6t(K z3wuavMKf1yxn*3*d`0h9(OXB^R`U4E^~2UOxACD70nu8lmuBt!A?;l` zS((kevC_K^0F0AULBXijWPq8yol)+uofT_jS4#z+l9tUd^Qft^h4g##MZS;TQ(Uu& z@+uD^7wf}}Z5qgJNGQfCv&+Ztk&=97vcI82Os^ddNf*p-ErRDb(cup~8tni={zDH= zQ&V&34H){OY%>DS>NWKf6x*Kozzr(#hm1#FZiF}^5L0>1k?)Y6A$fo_SpVo}ZhAIExfuQcSHjY!LSm z!thrg=A2XMnV0w@;M;q+;d}8)aX4$fZ6j{4v;?&q=?SU5#N^vz*SC!G8I)T!t&-zP zxmU?-z=^@Gq{Dl87K<}`keI)GyI;}>L+&hhx9lKmfztrx@+JJ21*{=M_QEOJb)l!o z7v${gcVGPaVMMeSB;=+u7Ck|*RRD=p9JBDqlo-AqI#d%&v&1+HTWSoO1e5d*8>NC& z`ug|0hbB5j3q5102s3+P0ULS6x3w8^Fg4Uu^#a_28tV*|(G!u*s>iL_OGrtB^G6)@t$6BcXT^HWo>hJJkQ?e`awG2 zkb{Xc;}q{U1qgIjF0d+g{(4S+2naxQT9cDaW3}ndCh8I}FdP{nw%;82FqJv&edR_gQ z1i~}A8SuARLax2w-z)YdY7HW-R8c6lPfrf?pwQd_&9_FAu3fL<68>>lEV+`o!Hzxa zc;}+rbwUvWBlJUeb8T|um6bl~<0Ic`r!nvdq!D-7WwS8Im%)mn7vuXbrtUP9WFmF^ zTo#>^3H@PsaWJpn-k$7HELmJ2lLiwV0Q+>3I^Cd)jX7;4%Z>-aFn3J8zNBaj^~6cq z;S0Po-o3_5{YZWAIggzK-9Ck|zV}h8Rf=u`!7!}aY2Ah08D1`JzcyZr<1gYZyAcPj z^&wiST(F8>;<}Ooc5XS6(YO!bqsPJJIk-7GAV!8ISSjL-%XL2My@I0Bq^V95P%LUb zEk7!;;wD=SEZQT}ha7gWaI-raV(BkWeOyN)SNy}JUQ~QkW)Y&$scC+qhH2Uo?(Ke4 zZR^(wCanS(W;AHY#vGOZY=r7WUB9yKGCe-=E5j5c#&cp#So40^vcRb>y~?@1VpFXe zq*jeiAlb{npQ_qSF4^9zs~5ooUhE8YJy3HfIZh3wiq&Bk9{vV5DoHRJ#%=8icvWih z)z~3R5?h=pDN=UJtzplxWkgTRAkMI8L;Ff+gnq;6fCl3m!ezS?{-kssBlQ^poW;E;i^#l_CD~!Ru7ptO>x7V_a^ojJl^$P?)pxobWWJ9RY ziO#`)hue-KUP4Gx&&Q`UOsjqJN4~eq>xYB{gm*+2RnIlr9_pJvU$OlRYt|s4#$ax1 zP`AOJy~>SzoJ=UFo+#rMMI}?C1(9~Tl!rBIZ?>Sqeg)F#K=a^K3Am*SOexf@Cm=f3vc_Jzv4vokaI-D{RF{l9m0lsEGf!l%awD#_K^%7!U2mWPxF=t;Pqub*ViONoddp zE1Ri}TOtE=tXY5Xs}r>r9_p-{&0ftG45u`&{R%-}+yZ&WtF)EX}7P z_2Mkxaq{D|oA2bK#lo+A=F4M5l+feE@hv&kPqzDZ&X_GARMPM%Ayt~sq)zxDOOI!a z0sa(h#HhsrZMF-2Xa2(5wOtX6f!{GCMc= z7dwU6*kP9|bdK{Eb*@QnYXkHCr8ln=*Di&_WCFcG%y7|42-Dwvn6#Zk!s>HSG_`}N zjL4J4G@RkJ!V*?$FD&_|hXt0%ljsF)N^IvM^E4S8ASy$~Gz;B;wvwuGBp%g(%Utj&>_O1rINUhQ5c? zDteTTEmw3(AD*i$sczA`;GuQ=Qsqz~Q1a9`L{289xmNV7)xc8qP}#*w#E2Sf5aLQH8$xLw!Ozr|)c6QpExQzxTM)K^2e$riE zZ!K&#R(mfmJ#8t}mEziDdq4Pk8LPx1aE4Bpka28Gs4QW`7R&IP*)0}YT40#pH9y&} z%xrbgqHSzV4g7>sWM`gS+gNv2wfClKs;mZU!0$7jsi`jQ==f6&Ao5k_9VA)6&H9~F-DgW&iT9^~vgsz>QWqVsktP(vCb@gy! zN4i>i9fQ+1d;62WT~%IeV1l<9U`SwQv7Kep{-`5}^END8wkzvfCC#NZ0B9o~zKh~%nAVV34pfL-of0raLM#TOYJwf~H zTCh`s#(^$J+bO^M0ZTZ-ES`oT?>G@rKJ=s1ABhKx^$`q$r!*vu#-mnMUKFyF#86am zSe`S%-`|{x6VfAiIk27>jn}p%hh?eCE*4?Tq`j(LqK00LlQtA#UMuN>Wg?zSr;{j_ z(Gp%1sMjuJhw__@o6yu7#G!zzY{*VFF#FljO1WA?S%}=r&KXO)EtKGBOHim?0GsXU zNqeAMpe)y8Ix>#78b z&otxI*R>XTR0rse(NdN=vAOe^qJPYJ(B!rP4BT8KcA!B)(5d9KjGb}i`4(Q|i_NF5 z6$c<{o3zePcp)#7v+bXpLbqZ+O0Xg`_SLh3lsP z63se1l-3>cvrySU?)=I3cICp-6H5cr0X9?wnD~FZ!}iHX_;U(*VSxL55ka{a4Z*Ri(_{|#@S;INKIKlAOA~ATdGZw8CvWvm?Nnag z@wXgBJ2Q!MxC_$UXAWpYE#Rh>`^Y+pjy&>Y)3^n-;S^>ObIV+)#TB65XJ zyA>3YFNyMBN%Rx@F-)$oC%upPiZ;J%d+yZ{w5bm9ro6|5@9Uch#_}5q*4djVhSx$c zws(r!7>P5W$K(wo(`4KnBoY)*mvo2f>+xl2;HCG#0nIFgMCs5-iRg(4aIx!G0Nc~C z!IT%XtD_BHR}w08KOM&D9$>V7=l>LlqW!)}1lp3Xx&#vq^wffQB(4%7vysnQ`D9G5 z_)qC~khK`4B!B$fODVndy|ec3tF?N^>Hhxr@!7VlTV$W}WfHXOVr~@>g#}Xa4%+>?qpSo9UFDkz`M5RUTl$18syk68Y@H1VlS)| z>=48$sipW94bZ6(y&wP+-KFRdY2|2X<$!-ZmS(SjsGj;h;T^Apx+sgJgYVUx=ah`3 z6M2m(6}>5hC1GhU9@H-AdA3053N9&bmmAN7lWbdaugjo4-zzs=%5Y9DDi2)VJZD1G zb&H;|bL18-Y&|96FD{}!BK_0X#aGeh9rV&MPQ#I&!Mp~4xFX;PR9TXMJ%Lq0^_%yS z!=4&XL1}w5Scwmc&9E*v1ysm$%trDUf-Wa^Ppj2YpB%(wR|_x7o|lj0<3sU0wdkS! z+YfJ@@bd~|4Glw0WY-8gzrhLh+;oc6sw7-F63emccs}a>CVQN)%uZgTZ@EdtyLps9 zn*_Dv9|sP+$M}JEPCQ9a8U|Jd=Cu7$0cvo8lJ1@N#HPSsk!hI_X@hsY-3Ad8fzJtu z$EWNy^82giU=KS7*Bk)cH@oKT>k3#NnR48UR>h25Z-75+nsztXkB#!&Y(u$ zKv@40ftLlvWhYIGt3Sr5F;`JRYjUfGzERoa;A8G>7eoNikwt-tsTjeY^{L|l@WrzPvxuOWDNq-atx-Jn?yDZZ*f z6ZnGj>9cUN?VOC#8%&sj@^^MtW8zfm;@?ucEi*e|#8%OPe&T$lT7M?X05^HeE3`H< z=`|$PrN}EFv`B!DW?M46v2V*o>IP_$vABf%e6+BFg>GnGwWFp@?7lJSswb;o4RrhI zdLwV%NSMWx01`%TcPj3|*b%^F^HlF+8qdyKQazf=a{0>t)qi9VC1IoQ!}#uQiEMn4 zhRxdsP6xl_HIvjmLgyxQJDw-HXv?}QmuGaxenkL8P>Q=cN2rN@|H==uE4eR=fj4Ro z;5#VQK0$hGK~aS9&BBzYW_=vG=|5^%SoE2q@RGa@e zS=0b79zgi1zO+;rTFh5bVUtF36nX=Gdz1$SMy~|aYqWW0>3|s@Tvd(6IVGr+)U+q6 zj3ISF;v>#WA6(W{|B%Gl-_;78qAOwb7{Vu?#PRn^7{hP6JQ+w|Gmbk=%211c`Map4 zbc&)Sl{!aZRbXe8q6Jm=S4m4uKfksBiv9$!esJ|sJF022W*oM?4}J z)WPKjWCcQEXdYI;tBFd5Vzo&_I#ozI;$i4$vK%x}U%sR#GzC0_ymlnVnYg0i1c)js zu?r(I*7j92m4PfDcE4lC4BdTqe99W^Qf{!{uEuQ7T&e-KIS#SH1aCePPNHF7Oy8tHL!d)E3HnVgi#b(l-$2@DjEseIlr`DEehyL&Gc z!(Y1XzG>x$rf3QO;njb(lay@x9&_-Q78{@(DaUHUBhl?J& zXGnV3LbGK%JO5v%$k6I`j;h$LLzj)%hDoKt2Ca7T6b(JQv=7=&&mW>tHwD=FYdOk| zTy}BfPqpk%*I2s8Yt1YUdotz{epw#FXeH-IUX?aDYVq%MctkB_RoqR{^HNKv@J7VOx*y1XpOyRCH3FDseuk<2y^UF1Wbt{ghFC%V2d$ z-*(MV>82G0zIlJR4pP+ za|c@vg1%&W1hoZYi%LgUAYlX7Pj5=KE1+sH!z+{PF_#?BgcV>v^#+;<|87fM2kuXw zn7zRueL9=WKA#eOkZyv=+8v0xpyrBm-m~xwu)EN5&e(RMtg0Ct2^bioqpV>qQLk{z zQbNDNb?8V>2b7{^3|QdtBR;H3PtU`JeGywclX#hO4P*0!92^bUVa|-th$Bmk86olG z2AybP(e1*W{(S&*5(J={m)l!&^nRkX#X+YE?o|pFK}Wfd@CHndp;aiC3Fj}PdFkeJ zqIoIjx0ry!qVgioqJn(M=+Lz>lx6teNht~>CBbCX8zfv%tDQvD3E9gN!Kk7c*L?** zOoD%ZHS|6Z&7<*iw=_@7G%$~^JR2@I1|cUKvEbM?+w{+rc?Vt|77tQb%2Z=uYAT0Gu_al2fKYiXoqP=bncZH~w9=PVaoVZ8J zB2qGuMtC|oulW(waC%-FB8R>924cxV)J#lt=A&+2Xb!@xto%c4y?W&*PuhfkBm|KH z)&|uS!NpF9+C2ag3nJ*weRg8c^7)3nN)b$W%1R`>_lsuVHnOuH}v6(XWNdMz{QAf=O#p$h=cna z`(7+GG(*R)bUQ@SxJU6EcWMS2D^#ywgt=;iR!s~}{SC<0iRu`o-ejj?p?Fs%nSaFK z>c-6Xg6m3&wlcsLlBlfv^hwHwR0))h&uQuT{s%e}8GMSK>#SO0txs>c2lT%8cKCrZ zZpOdouku4y-h?>Hi?fFVI7hQZOTpGV#0R<89|<-fB&TO2KC3!bqGK;KTzXCZq&B~> z&VfEz#sKjC70e8JQc42(Bm=@fg$DyJIhc@3e5@gXk*v(sD62M{Ruxkxl8QIf*nibN z@4|3*B82<1%*hsA7F%jT8=42QQx~B7MSTAKflp}>u4g_{qP)~UD)qi@K8064bAU6* zo&6)avyEOX;cXqyO~D+HrC&OPNbJsgwwX{dLIu7pb`)2PR#jv>rP1((rSpd2l{5;g zh%;}c;&vQ(0CpEo_+<*@3QW6j2+*Ia`QLiz*>;{fguo)U@o^Nag~8CTc-W+TPr&i{ zQfU9GvHc00&ldZFf4`+EIAK2%Vpx;3mxy%H7_OsNidpz@pX-l|-}utgDk9*1^tFs1 zw^XP72(-Qs)&gl>;21{PnQfFbU5B$&ihNR<>)S{Q@8vH+80a z^l4i$dmwsBk`VPXV1~QQhx6MV-0dH1JUt#M#13fy?mxX**CRNMD_E7ViJavEVDfi;8767!+avDnhx4fOl(^d&0W5^2`V6suMoDv# z2#ZBvioc#e5$TQGM|vC&@^uFPGUnSLCXGoQJLwKlJOx5KXOp-n$fWzmcF z4)j1s?BWPpuCH1i_W;`(;kB>m`QyQg+7*&&Uo8l3Unz)Ye{4t+_SfStKFe0P`zV$f z?VblG;&uGZ7SR^w0Pr{HMG%QFX*LS+w)dCjnj;KheEqlQ@q=A)avzyK7#Kp#GM*|N zYk1lM9AU3Lip?2t4ENZIUyF5iA)bFE^8zgkyyi|9Yy*l{ldBO+@itkWSHxmQ7qV`0 zx)_YwgGWhHJSAd_ZIVyH&)VsEF=AG&7H0bPn=>RV+&p?Rd4W60@Eey%}~xm6y=a5J{@Kp-Znx z*}1xAop$HCt^nGYKjk)`J9YY~}@+g>fOyORJ#ix)4&otDSf`+fJ`zPHvp zSy^ZH%zw|(mCVWB^Gn}zBwlVc3AO?+)`1EKf8F&3k|ZQ6none z+#h+A4edDBBR{pq;;oGm8`^-DuK|-DTxL3Q!S51wV|CP!bKjj((&O6=E1~e3#{^dk z2_f<^TMzTXlRf7u!vd32Yvp_KJdiVAA?mcd=Nzn zH%uoOZ&@*Ow>zh|QBk@gIhbx=cTsOvqI88fqIAVO%6dul@|~3hJDN)Owcz_9uH!R0 zDwj1EZus7cyiA3MIjAuW6HPpogcmidq1a}?38>hxx@`+~y$uUC-r|H$*wzN21Wew8 zLWoRD)Va7LmXJYs&f_BT!8tvSbdSotCufN8pn+Vx$Cn_gEu0=&DR&(v8a;D8Wu>tW zLzOwz7hm`ZlnQhy7fZ|K#_edzK^75D;oU4=I9vc0tHOm3ugQdKc0ygMM#8d5zkRvD zX902y#rEu61WRu$$FM@}X1GArG0PsNZ&YW~SNC1GZ4A<~iW?S;$Yh&-Xm0B{<4>(2u&xyG&S>Zt98WEc^<)u+ z#P8T68yMoXS#L>9Zl(Q`a9EU3>4n!0C8kkhaS3atNoxEyAEnkcALpAtml4kA0uu!ekPB-aAvdjW{JB6Y{LP- z-+|Yp*ZRlBSV1H{AOeh4v|Q@5ZVw%AC}X{#YTrzsWH-xs@IpFl8*1s`eG*#1ijpQ) z19vWCAKC}ZW;Y;w?LpvX8wkvwIsUBSd3i7Q%a`#)j*rlYWGM}l$7qPqdF$`R8&e z3lRV?(wvI8Paq>`{8We-b^vqc(vSGVEV-N*pU;b%7#?Uya4wviw2xm)e%4jWs1+7z z6$r}$$SMHq?Sz8ACNEdm;KPXyWKA#dcX?+hMA(<)55ks{{TD!zZQ{JA*83M9q ziY1opFsPWqPkt!IroK;w&4C;~P~Ii ziCV_ua7sV}IVs?rSA=%`ZQ>Jm&W_~BiQH!&O4~E;`KGqgX##5&%+%Z=9surQpYZ~U zj}gKO;H|ukoE)Q=gU|eXyfDCQ843Td_4L?p=iG<0)+YX!DiLw%A+J^JXPrsySU7OV z=#z57SUW&I)h(A6X>9N)7mM@tZ;MXbNyW>AY$Fo3pkm0TdtXzk+^UODc4k|1&g%nu z46}qn&_f>Gm+%}u24Nve8PM(zcdQT2t+qxFdCcKB=p%nx4P6Q7n-P&XdX>*8Ex5hk z%h~rOJG2V7^<^m}LMG~v^Lt6@2~19(NIf9Lj3yj3!26wW#krC{FoYT-j=Q{XsIHX) z+nGS^3`w|r+EhyDg`rTC+L=mh)Ws`9MT%g>Wv!&})zA&x&`V(r!+_+~z|Kp2O1THQ zb&)=ve1VXkdT0Cy2O1^@Ull%m%JoW!@^wPhEW%WYviTYfOS?l#Y&g2p8rO30?9eJx|!P9Nm^T&+x{yYmYQOyf-8;}z7A|LY_~(5 zcYK5?mS-x~N6Ek%B+A56663JR*jTMYvoHmYI#m9macqT16+j0RI3Cr8xEfbfY^-N5 zC$d((b1!nTmwsN{40FKH3GrgdD2Errg>|5fzh>KK9CLmSRMU}FqJg9*w|#58miP(K z%Bv-R<>)K-FS{9>g|dHl9k%y2)4vs|g+{y8_3d0`XaaqdJEbcxo$y2MDt_>_9i?H0 z`WMZ#pN_HL_-}IAy`QcmY#}z9L{ZeC5DIXi7Gf!S?*r73Vd1+j8<|T}C#=;U{@mv~ z?rFGFVd~m4CM>hN`4;rE)n4yLzgY>n->12|-??HqSHQjWF4i;v=5A@6Oqh;g6UW6%ew^9UjsFW*`^5^>}~?_X$J;)4EU1z=x{;w$@FN78Le@G0`o)! z(r)j!5FEx%BTd_njwgTQ*JYw{Jq?#BRhY%EmBDp-VHXv{W)v5b5#y$S1tG}AcId>D zFxw1Uf~+^__g2O2ik$2xb!at^uV`AE6=p;Yqo$#xBoZUn*Z@B4B@@}jd{+5wywuzg zwruh7ooTF}Grgdqa=1kt?lhTTHkv^clsAMUuR`<#GvxTyxt8og11`Vyzvi$`xk+xT zg#<`0h=|AJ%!FAdETodxj$-+J_{AwjpWAqVJn`;JpjB80(NcW&^P|8@f7E8qx5QhK z-RY>&i49m1_Nk3tEN3_Fv;L`g&%t%{R}j}h%#`c^Lcx(&XgQL!d_(X+Rk>m zy^98B%%pI$DG|<&ohNtD!Zr@1^VtKKRg(C8$|+_NYU zxS}`8Mx{p@Q(W9R2UNe#3Iz^?6n5i3(3f2x`xS6A90+A9xVI^GG+PqkW$QQk@EO7vw!$Y3y=OpDZp-vEYS|vAXrjYK z2@1F~Z4sj1_d=)Sno;=&1>Y7K2K-3vQXvvB-bQshB&hbdkU=>xepCaBl$?bLyuG8& z=Ga|5cMGrj)jIUS`Vl!hxq+(p!&uF@)YiDWkBl9ZZBo!LY)IS24<8IAQdqX6eYbA^ zDYw+fT&qCDj2;ZqN@l8SH&t3qE19&ab+B9ND0lvnHW^2fF}UW z)NZ5qU5bBRbDX>{L-mI+KsxzdOF*RS=8oTVj1i(L!Uj9_j+>Vt2ob*Vb;%<<0aCp zOjCw4GxqET4NY|T78!WhQ0+ZMn@2e`zBqDAJwGY7Y4S!?23wc&LnrF-xw?sP0YBeX znYDa{je)}?d$~AK_(qckVf-K;S0a&mJK9tiz7tbW-FRG&mVQN}x=DJAIX<{_<#5o8 zsQFj}arf;eEf*O;u2MJ^X~m!CC`eh%)xC9GemQUF0FMaIO2t0*s>m+ueY)CNbF+xf zdXrKKAkmZGB!f4+QZpKt(=EonIk#o)yBh!OEpeP^HIzI~w4d9(G!@D7ddJ2|T?pfS zwun6FuwLTx7G2!zQd>PTYs$A^(@&{(DxtolB))=u$g+aa{DeDMC3T&0aZlOWIGOy` zavHLdT83@zUNsW!*!R8`)kC>t1YE~m(bYvno^ne%z446vLi#ZR(jnLr9)cFqcp50l zXBq{o?=aM?uda2Do4@2+K4K$+v3U05OAVl)3wSmi0n_1;Vq)PqNxeQp&RJzTr`tyw z2yr1g3>|O@y|X8W4dtsfUBTx2cS0~C{29b>lenzP)|juo+E}=h(n;{B`XR39f_rJ}UTiD-_XbVgKfpGqXnk5e~)4p;a5fNQ;?A z0f#MIv58%^IG%0d%hVw3H(806Jw!_&C#nE&ehZbAL2!{OI_ikL%RcYGJ2e)P9pPxn zTCCyl3ofpg^p5+dm*3BQ_7ob$GQ#=|SP9s_;(COmE~q!SYlTBVI8;qr zi^x0krZ4pr5)_Xjq0ExD>5vK$0=<<8zFgMKY5wTRVdC-&A42rp1_R}CVN2R??dGN# zbHR7Rtn3~~Y|N5H{yd!yIjmg!Z+zDBM4`3_!tx0(FKzGR#8n_*1pi=mp8ajNC~?@P z^}Nd43;x@W6-G;Lo#NV%R0Kni^atBV_z=ep67;Sp$N5_V@3t=+E4LmYCmSnjAzhfu zgh=&*=)b7f;jvxlq!O)l^|j;rMmIRlK43GsSh;2q;Zd@jY}OJzYIdz`)Sm63cSUr^ z2ksaRSwEtObdTN;cYHYEx(x^r%kW3IxtK)2gs>>?WtH5b@1_y=wiS20pz zKTl?B)lD{-iLb<7%VJ}H#c%$+mpU}J@Rpjm>9Z0^9Ddf({qZZlMR25f;VNM$slQ7a zEcB3DYOi=NACjk`+Uta4#vtYU$~(diIRm*aEj~o-g8+M{@M3x-NG6{`FiAd|F3Zdz z2Z>;UEit6*M51@*J&+YwHRN6PSPECxCkx;9DKw_aK*c&`{1|h3w18wsX@Bn6TBY)j zWbt}S0@7JOm^ASFp)Kr5ubxNZB#+#kW~W?_RlVz}rF$k~KDvGqj;O;k0jzL2GWgD| zD0Xn|T*ml!$E#3&kUaf#1DyieFLFP0jV{Mi%-aZrCs`QLFP*R7qqNdGT1{tr8^2#&Kh#9(&DOM&;!)cCVif$Rkw|a9u)#cH$KpLq{YT@0`WEG zhSifWcHS_8H$&0|-Yjw%Fd_Dd9aSq-R}t-7oh@BbWLa=m$=JLCn%Nf zY&%^PJ>+WE2GNh}r2_9C{ABmG=vt~K@|)TOvDbI}q~j@czvRt7|Kvi0mZrY?TFIG3 z?#qYJloN}%xS7vP6UQF##ZDhA5>f)pbno_$Qh|j8I|e$6Os<^;NaS)SidGck?lVtr zeCpiM_E(0f_>Q*)(!=fFc_!(eTzh%n*~+kG`O+P5&4P@5+-uhDPzXmFU}!{Ojx&5- zF>DY!n|@0{$Ew2uFe95CCpra<^GMxc*F<%Q=|*hW4p+FedCOn9eQcgHA#$SpuudMu zz`1oK>l@lqWl&R09~YZ;Nc;&BUrW}d#LRB%HkgRHu4(Ae($}2D)DBiTJg~SjU$ElH ztH9vMUIDpulTDxIhk?^<^tmwOu9=d=xBCgU z_sXE-@Tw9(f2$kiSVw{)>Xdc$SAPo>`YRq^jrfeV22|4Pc8MC3EkhdHF%gX~Y7FQ0 ziiGEiuJMN>%V=~Ak_u)?f`e>qOU9NvigOj#^LXoFbq?~6<5@|chpx~-yEIDFdQ-vo z4qQ+GW<6F_DxVikg)HM#us3bCm~IVJ+6Yvkw9gAZ+D5LVGJ9)EMyg5F=yQB|WX)x< z9f?r=hA+9z+W@MK@Em+&Lf5BuvEbtbdg!G~K$mu6a`wJ9A%>g2*+r3?pc3 zjlu?p8DmYrRsyz0HVjEeiJC?>d!RZnr`pIe-gS}}fdQg;ath=Ow zJ71W-XmAD-H{4&8$hUD^TAWXO3?ClFU(H@DaEQCa3ly||fdDpcBJLF|jExC<& zqpn74GR&a0qpOItlYQ=7^hUhi$XrW`I2ry(!L@*|w4xGp72;-Ky91--cnxB`QqGXY zypy~eTI!tgFb4$Mi;I zS`-jt2t5~8@E`07yh#!S{-PyD@rv<}5oyj!|W|b-Yg<+uF5d1o9h9M##@TP zu9*CZ)kSwso;+hzSib(&6_YjIkIjff$FSen5f*ED7J2emnNLFHW2`Zr6U%~K0C{&7 z%dnc)8+R^+xfh_Ts@z{uG`gg37}q$8YiId-T)9Bm((7>e9LmOW zH#0_%&zQahU|zTekvMipnN;Bek53@avdryn#wY2*fF}?TXN?EtoGPPG?dNB1hfpR& z7`b7!a4|09+uA_*i_A()hyen530|rXR0QIgWo_`;m%15@}vkwl6dn$^_+=;5jeo*@(bPbP^d+|Fk-9?TnqY_wJF2atN2j=+P$Ghx4XzYJ`3N)!{%gtk$#lgrYoHpc>9pAL2 zLYDr-2SIUT0cB8K71(fY(kPG-vQBk_m9cL0_gmMP_!8CdAsCP`As2%mI~7p+Rm^+D zyj?`9eM+SePJ$l1annFeFC)~T*Yt*BV7yzNDg#9o=qwgYmIb`w2i`^s!NFE;NiUM1!c9(m9XMfbxy&TIv+JyJB-;{;LE((to=>`C`nT38G;^{?2#Vg z!KIeBBXQmp>>Q~C_d1NBVWu=u$%CGlA7gH?iWXe#507+-4*vQeb^!lvA-A8I zBWO7WNvAu|_ZLp9&r6d4c-5bu8muul+T(VEW(n9h29lW>DEPP^30aP6Wm z^d#H_%AU}g+i+}+Vca?PiM@Q(f_|Q{B9LoO#S#-uouk5En}rS;TlTJr1w3I*U0K=1 z=K92G0WXuKkGMmz1*95Z(Tkn#vQz6e!7DV!p$2~+#~O@^EZtV}vvEmk%U%9acpY$P zT>)ZkxG%rRu|t^ulC0f(aguVWp3MgALLd3bvQy-JzVd;4Q--P%u3=ezM-CP0UR~=G zJSNOyrA4)nt(xzo&ErZH$R}nrn#uRBYcEGZ=(I_@&hJdPuwX3L31Z9tW12h3D59}5 zXzM_UXp@7R;zZ%#xT-PLe8;i3j!@U8c?={;{=E|BpH#BLU1TpZk;{e41+z|Xpt#hFr)r__p7qsJ~!6e;F@7TyE%Q4>JPh-MkF<& zBkN-?_BF0mVSRyYE{7iMdCKgeQV4^PQpn9Ye|sPUBupsDqp+Lwr>2lxxeul6ydG65UG!x27H0`$_i`)r{5%D%fVy2ZvyAcfMV%7YV>J@_)VC-JAy^w(&H%o4x2uhVFL5)+#G4;0+yl?G#olhiQ zDo3}%n*(NNrBQz9o$=y=RwF8ZO~ut%0`X0=YmylYy* zaBtd@-{i<+^5H#ZbpZ}=Mbv=#VGbKVIxMdd4i*EI80`n6VaSr2jN)ZuL?#?*?~Xo-yIyg6rg`tLqofny22=PC|AfJSi5{?0`t{!v#xK-J|CPqgW1jwzruKJ-T{_DRp1?M(@9cIgRM z(cPbMjKkk3LmB!w3{!f4G+`E^jcrrwPJ<83Q4YxcSPcRb;0@nm-+9s?OiOFA-ikJU zmum;09N?IIjDLnloB+UeilQL375RQKEaA+exN7LUS2xS8Y9$fYI-WS5I3qJ-aF_i` z@hUO6UFpm8J5@M}M;KB0tW|<~=12}MSIgartR;V6kT-l?{2l8%qUoOAP+l;5iQ&Yn zR?Q`O_V-}Zy15NLp+x684$1l@wqv=$#I@uk#paj0sGUlk)_1YJOL3seU@Gn8Bz`;N z)G&daoy6AxOf{#cu`K1zd8st%?w7C7*FJoZtjiJsFcDb23Yie+e#hk<`FJ_?&0#yjcs>DN<2{PV1e1LWuTb zi|jy`zHfN{fSj!!p(LX1hrm)J)XQ8W(i`wfV;Vx*;NFmIjgGd31Dm3|4?)6wK|iyd z9(5@ZV@A=x%Jah8PywI9bQOf5lKJh^%YAp^cG#EF0dyvPXwe=hS; zUY8&a#~;3~>%x0Eo_kXdH>DH-XdC<@DBDC@de|~a5noj)Xwv zkzPWvyj7>sy=gCl2UP@Pv1-oGdC2Fb3@{5x*3q{0Z#{_CO(XcbNcwL2ZbfpCws8V_ z=E2ksrx)d~?$5X}rz5?z23)CxD28AHi24#1@8HRezKMxi9x+fGp=?_48Y6Fh!7@VK zbiW2k4rBrxGG{JafCfBll9Nkm6}BKiQEUm*kd7R$(jZ>l)A#S`XXQ~lVQo=MJEQ5} z2hP7f+F9OL1&+*F+*M>TkLq#q$h>IUDhs^kG~{B_Z6w%9u14DD7Zr4MFth9Gsw}h~ z2}^D;VIC?nvc%+zttcheP(TUWuOPa&pmU6?M2Ks5HWWKesVJWZzCbiz>1+W_hZDfx z4qpP^9%sGdu~=r`!!tLUO2sP~Z(|<|A9HntI#ySteCtVZz*A>$oa2$K(ZHi|H)__J zPDHXe=Z@62Qmb!P_(W>kd}4YdCs9@Qb|rDi({0}sJKk@XRcGpPo)M4{4n$$3OaUud z=vl@|!lN8z*oW6NHvLfiM#v4is6w@Q+oSls5%GcU-0mG-fqe?Sg=;G74CGThuQ;&1 zt+VQ5iGjw@mjW|Az`Y@Z`shlyjiHJ~OBel<*pK$XuoV|hHnBX?8;2-?`ZR6k91-!^ zAj;4;3RA|TWB9d<0_eq6#+vl=tZ%ubF_CN`iC=)>bvir6I`>G=WR>B1My<+RV5wWp~)rN+N+ZXn(y!;wB~ z4z1l1L1u8yjm(vo-6lgOJc|sC;AAt!!GyMS^K^vfZW8f4DB{G6l>|PQRGwye)>zi`P-4E;M;X{?1jPvZoc{F(r#NxRA+4`-waXS z0Yf%xZIp($n}GTlpt69@DI~Z)_HzSY8qi1R%yP1`{&ly_{z5CNfL=3{E^ve}>17s}ZlcLxpm> z$k#>1;qLYv_ank~aCyWq7(`1l@m=)S)Z{aC5g&BR#rSF zgAJC-Js*}HXiK}ACzKD;tPvvBc+D(8oy~oD3oI+B3|~=3;Pt0j@w>6RaIboAuI>c8 zsvsPcV}kCxaMX51ExS#*gHJOrxu{YQpA>2F+SAwJ^U#67h?_q{iMz;sFxr6a=ovM`Fg?W!HtIS!>>Ap zZgDr;q#NCynkRKCNA&A z=S*58Pyr?vzsjvWEp&lX!50%O9O2E7nI!Ol&C36sa1=vgBr0^a4`iNjWwAU;w~!tA zRd*2j@USLMS)X%yrO7!$eAk?E^hTgH0?7j9xT#yMX4SpP!LMH&chnr25NWjkC+6}& z^MLjX%p2t8QBGgEQXSq=8P`iU(IAEe@XucgAWbwL$c@@i9w}@}uGC8pHD&Cvd}qB* zcZ5zayaa4%7~lHucwi|CLf5l526|MFgxJ_0K4KUO3JFZB6A}E-pq2;1NV!O3~KIX@`1GP!5~XuQ+;FsGm_t} z31{{pSUn4+Yb%A}Cj!&tw)Ibn#$TG&*x<%V;>M7nmoL!&^KU&cFwEfcVOnqr4I$WI z42$&Ny!U7H9L@9lpQR`W3l$t_MF*~*Bz^T4=l!3hC@An5C;k6Z-@zr5Jb+PD@am)> z;1(5(Va)|rnqmfoU_2LJf(!d-pG_?A&=fI%8yD>CO$z=sB@P(F1B*{<0+61N+gux&PGvJBxxyT3>^G647K(I*vKw$sj zb58TS3>kTFfhV@=~8GtFRut&*_N{*e|1 z(eV6k{FwB7R5Q!~M*iQX(ySPO|Cx3Fd??i)2%lT9z)Q2l03PArRTb$tVCFey0H@gB zCK@@63nLh1o*95| z{#>L6|La6zf!*eb0dFk9iSw2KbZfBjfZ*?Ia5{uW^%uwRUket@vG@k?|4o2z&f7oT{B;T< z?Ej&@fnSXfk^aF6`;YEf80Yx6kQiJ(iUsyY`0s0X%YwG+&M!O7p|>4X%Z p2l96jk@l^Zg}J+%qszY%wp111pHsSEVECS2G`KJ@B+GwU{{uOQQy%~T delta 22557 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m"' +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -89,84 +140,101 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi -exec "$JAVACMD" "$@" +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" \ No newline at end of file diff --git a/hello-service/gradlew.bat b/hello-service/gradlew.bat index 0f8d593..89d1d91 100644 --- a/hello-service/gradlew.bat +++ b/hello-service/gradlew.bat @@ -1,84 +1,91 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega \ No newline at end of file diff --git a/message-service/build.gradle.kts b/message-service/build.gradle.kts index 7296c47..c5d9051 100644 --- a/message-service/build.gradle.kts +++ b/message-service/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { id("org.springframework.boot") version "2.7.4" id("io.spring.dependency-management") version "1.0.14.RELEASE" @@ -5,7 +7,7 @@ plugins { kotlin("plugin.spring") version "1.6.21" } -group = 'it.valeriovaudi' +group = "it.valeriovaudi" java.sourceCompatibility = JavaVersion.VERSION_17 repositories { @@ -16,20 +18,17 @@ extra["springCloudVersion"] = "2021.0.4" dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter' - - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-all' + implementation("org.springframework.cloud:spring-cloud-starter") - implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive' - implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'org.springframework.boot:spring-boot-starter-actuator' + implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-all") - implementation 'com.fasterxml.jackson.module:jackson-module-kotlin' - implementation 'org.jetbrains.kotlin:kotlin-reflect' - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive") + implementation("org.springframework.boot:spring-boot-starter-webflux") + implementation("org.springframework.boot:spring-boot-starter-actuator") - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'io.projectreactor:reactor-test' + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") } diff --git a/message-service/gradle/wrapper/gradle-wrapper.jar b/message-service/gradle/wrapper/gradle-wrapper.jar index 87b738cbd051603d91cc39de6cb000dd98fe6b02..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 27883 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 delta 22557 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m"' +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -89,84 +140,101 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi -exec "$JAVACMD" "$@" +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" \ No newline at end of file diff --git a/message-service/gradlew.bat b/message-service/gradlew.bat index 0f8d593..a746093 100644 --- a/message-service/gradlew.bat +++ b/message-service/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -9,19 +25,22 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,40 +64,28 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal -:omega +:omega \ No newline at end of file diff --git a/message-service/settings.gradle.kts b/message-service/settings.gradle.kts index c8f9f89..5f9fc02 100644 --- a/message-service/settings.gradle.kts +++ b/message-service/settings.gradle.kts @@ -1 +1 @@ -rootProject.name = 'message-service' \ No newline at end of file +rootProject.name = "message-service" \ No newline at end of file From 49a465336703cd6208b36295e0f75e45c802b595 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 16:03:33 +0200 Subject: [PATCH 07/27] message-service application dependencies revamp --- message-service/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message-service/Dockerfile b/message-service/Dockerfile index 3a356ff..c44f0b8 100644 --- a/message-service/Dockerfile +++ b/message-service/Dockerfile @@ -1,6 +1,6 @@ FROM openjdk:11 -ADD message-service.jar /usr/local/message-service/ +ADD build/libs/message-service.jar /usr/local/message-service/ WORKDIR /usr/local/message-service/ From 13736c10a503da893e3a920acfed6d509b52bf23 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 16:45:01 +0200 Subject: [PATCH 08/27] message-service application dependencies revamp --- .github/workflows/build.yml | 39 ++++++++++++- .../{src/main/docker => }/Dockerfile | 2 +- hello-service/build.gradle | 55 ------------------- hello-service/build.gradle.kts | 49 +++++++++++++++++ hello-service/settings.gradle | 6 -- hello-service/settings.gradle.kts | 1 + 6 files changed, 88 insertions(+), 64 deletions(-) rename hello-service/{src/main/docker => }/Dockerfile (68%) delete mode 100644 hello-service/build.gradle create mode 100644 hello-service/build.gradle.kts delete mode 100644 hello-service/settings.gradle create mode 100644 hello-service/settings.gradle.kts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a170363..ba11518 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,6 +38,7 @@ jobs: docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }} docker build . -t mrflick72/ui-interface:$DOCKER_TAG docker push mrflick72/ui-interface:$DOCKER_TAG + build-message-service: runs-on: ubuntu-20.04 @@ -69,5 +70,39 @@ jobs: fi echo "$DOCKER_TAG" docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }} - docker build . -t mrflick72/ui-interface:$DOCKER_TAG - docker push mrflick72/ui-interface:$DOCKER_TAG \ No newline at end of file + docker build . -t mrflick72/message-service:$DOCKER_TAG + docker push mrflick72/message-service:$DOCKER_TAG + + build-hello-service: + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + + - name: install openjdk + run: | + sudo apt-get update && sudo apt-get install openjdk-17-jdk + sudo update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java + sudo update-alternatives --set javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac + java -version + + - name: Build + run: | + export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 + export PATH=$JAVA_HOME/bin:$PATH + cd hello-service + ./gradlew build + + - name: docker push + run: | + cd hello-service + if [[ ${GITHUB_REF##*/} == 'master' ]] + then + DOCKER_TAG="latest" + else + DOCKER_TAG="${GITHUB_REF##*/}" + fi + echo "$DOCKER_TAG" + docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }} + docker build . -t mrflick72/hello-service:$DOCKER_TAG + docker push mrflick72/hello-service:$DOCKER_TAG \ No newline at end of file diff --git a/hello-service/src/main/docker/Dockerfile b/hello-service/Dockerfile similarity index 68% rename from hello-service/src/main/docker/Dockerfile rename to hello-service/Dockerfile index 064c812..cad4b56 100644 --- a/hello-service/src/main/docker/Dockerfile +++ b/hello-service/Dockerfile @@ -1,6 +1,6 @@ FROM openjdk:11 -ADD hello-service.jar /usr/local/hello-service/ +ADD build/libs/hello-service.jar /usr/local/hello-service/ WORKDIR /usr/local/hello-service/ diff --git a/hello-service/build.gradle b/hello-service/build.gradle deleted file mode 100644 index e4e806d..0000000 --- a/hello-service/build.gradle +++ /dev/null @@ -1,55 +0,0 @@ -plugins { - id 'org.springframework.boot' version '2.4.3' - id 'java' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - - id "com.palantir.docker" version "0.21.0" -} - -apply plugin: 'io.spring.dependency-management' - -group = 'it.valeriovaudi' -//version = '0.0.1-SNAPSHOT' -sourceCompatibility = '11' - -jar { - archiveFileName = "hello-service" -} - -repositories { - mavenCentral() -} - -ext { - set('springCloudVersion', "2020.0.1") -} - -dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter' - - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-all' - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-loadbalancer' - - implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'org.springframework.boot:spring-boot-starter-actuator' - - compile 'org.projectlombok:lombok:1.18.6' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'io.projectreactor:reactor-test' -} - -dependencyManagement { - imports { - mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" - } -} - - -docker { - name 'mrflick72/hello-service:latest' - dockerfile file('src/main/docker/Dockerfile') - copySpec.from("build/libs/hello-service.jar").into("hello-service.jar") - pull true - noCache true -} \ No newline at end of file diff --git a/hello-service/build.gradle.kts b/hello-service/build.gradle.kts new file mode 100644 index 0000000..8f1b1d8 --- /dev/null +++ b/hello-service/build.gradle.kts @@ -0,0 +1,49 @@ +plugins { + id "org.springframework.boot" version "2.7.4" + id "io.spring.dependency-management" version "1.0.14.RELEASE" + id "java" +} + +apply plugin: "io.spring.dependency-management" + +group = "it.valeriovaudi" +//version = "0.0.1-SNAPSHOT" +sourceCompatibility = "17" + +jar { + archiveFileName = "hello-service" +} + +repositories { + mavenCentral() +} + +ext { + set("springCloudVersion", "2021.0.4") +} + +dependencies { + implementation "org.springframework.cloud:spring-cloud-starter" + + implementation "org.springframework.cloud:spring-cloud-starter-kubernetes-client-all" + implementation "org.springframework.cloud:spring-cloud-starter-kubernetes-client-loadbalancer" + + implementation "org.springframework.boot:spring-boot-starter-webflux" + implementation "org.springframework.boot:spring-boot-starter-actuator" + + compile "org.projectlombok:lombok:1.18.6" + + testImplementation "org.springframework.boot:spring-boot-starter-test" + testImplementation "io.projectreactor:reactor-test" +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + + +tasks.named("test") { + useJUnitPlatform() +} diff --git a/hello-service/settings.gradle b/hello-service/settings.gradle deleted file mode 100644 index f44b119..0000000 --- a/hello-service/settings.gradle +++ /dev/null @@ -1,6 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - } -} -rootProject.name = 'hello-service' \ No newline at end of file diff --git a/hello-service/settings.gradle.kts b/hello-service/settings.gradle.kts new file mode 100644 index 0000000..9c9dad6 --- /dev/null +++ b/hello-service/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "hello-service" \ No newline at end of file From 915d1b12cf93574af0ed836f8ef557b30818c94e Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 16:52:35 +0200 Subject: [PATCH 09/27] message-service application dependencies revamp --- hello-service/{build.gradle.kts => build.gradle} | 0 hello-service/{settings.gradle.kts => settings.gradle} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename hello-service/{build.gradle.kts => build.gradle} (100%) rename hello-service/{settings.gradle.kts => settings.gradle} (100%) diff --git a/hello-service/build.gradle.kts b/hello-service/build.gradle similarity index 100% rename from hello-service/build.gradle.kts rename to hello-service/build.gradle diff --git a/hello-service/settings.gradle.kts b/hello-service/settings.gradle similarity index 100% rename from hello-service/settings.gradle.kts rename to hello-service/settings.gradle From 5408cf1ab4576718788dd4cb246e05a21f286481 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 17:00:30 +0200 Subject: [PATCH 10/27] applications dependencies revamp --- hello-service/build.gradle | 5 +++-- ui/pom.xml | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/hello-service/build.gradle b/hello-service/build.gradle index 8f1b1d8..b499c08 100644 --- a/hello-service/build.gradle +++ b/hello-service/build.gradle @@ -30,8 +30,9 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-webflux" implementation "org.springframework.boot:spring-boot-starter-actuator" - - compile "org.projectlombok:lombok:1.18.6" + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' testImplementation "org.springframework.boot:spring-boot-starter-test" testImplementation "io.projectreactor:reactor-test" diff --git a/ui/pom.xml b/ui/pom.xml index 0522958..ec77390 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -17,6 +17,7 @@ 17 2021.0.4 + 1.32 @@ -33,8 +34,8 @@ org.projectlombok lombok + true - org.springframework.session spring-session-core From ade44a857c52149f3c75d791ac5ea5ee6daa7fbd Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 19:43:51 +0200 Subject: [PATCH 11/27] [skip ci] --- kubernetes/hello-service.yml | 3 +++ kubernetes/install.sh | 10 ++++++++++ kubernetes/message-service.yml | 3 +++ kubernetes/mongo.yml | 4 ++++ kubernetes/namespace.yml | 4 ++++ kubernetes/redis.yml | 2 ++ kubernetes/ui-interface.yml | 4 ++++ 7 files changed, 30 insertions(+) create mode 100644 kubernetes/install.sh create mode 100644 kubernetes/namespace.yml diff --git a/kubernetes/hello-service.yml b/kubernetes/hello-service.yml index 49951c4..77badb1 100644 --- a/kubernetes/hello-service.yml +++ b/kubernetes/hello-service.yml @@ -2,6 +2,7 @@ apiVersion: v1 kind: ConfigMap metadata: name: hello-service + namespace: spring-cloud-kubernetes-demo labels: app: hello-service data: @@ -14,6 +15,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: hello-service + namespace: spring-cloud-kubernetes-demo labels: app: hello-service spec: @@ -58,6 +60,7 @@ kind: Service apiVersion: v1 metadata: name: hello-service + namespace: spring-cloud-kubernetes-demo spec: selector: app: hello-service diff --git a/kubernetes/install.sh b/kubernetes/install.sh new file mode 100644 index 0000000..a46c39b --- /dev/null +++ b/kubernetes/install.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +kubectl apply -f namespace.yml + +kubectl apply -f mongo.yml +kubectl apply -f redis.yml + +kubectl apply -f message-service.yml +kubectl apply -f hello-service.yml +kubectl apply -f ui-interface.yml diff --git a/kubernetes/message-service.yml b/kubernetes/message-service.yml index 29eebfc..3e49042 100644 --- a/kubernetes/message-service.yml +++ b/kubernetes/message-service.yml @@ -2,6 +2,7 @@ apiVersion: v1 kind: ConfigMap metadata: name: message-service + namespace: spring-cloud-kubernetes-demo labels: app: message-service data: @@ -19,6 +20,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: message-service + namespace: spring-cloud-kubernetes-demo labels: app: message-service spec: @@ -63,6 +65,7 @@ kind: Service apiVersion: v1 metadata: name: message-service + namespace: spring-cloud-kubernetes-demo spec: selector: app: message-service diff --git a/kubernetes/mongo.yml b/kubernetes/mongo.yml index a0cdb97..9ef3d32 100644 --- a/kubernetes/mongo.yml +++ b/kubernetes/mongo.yml @@ -2,6 +2,7 @@ kind: PersistentVolume apiVersion: v1 metadata: name: mongo-pv-volume + namespace: spring-cloud-kubernetes-demo labels: type: local app: mongo @@ -20,6 +21,7 @@ kind: PersistentVolumeClaim apiVersion: v1 metadata: name: mongo-pv-claim + namespace: spring-cloud-kubernetes-demo labels: app: mongo spec: @@ -36,6 +38,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: mongo + namespace: spring-cloud-kubernetes-demo spec: replicas: 1 selector: @@ -66,6 +69,7 @@ kind: Service apiVersion: v1 metadata: name: mongo-svc + namespace: spring-cloud-kubernetes-demo spec: selector: app: mongo diff --git a/kubernetes/namespace.yml b/kubernetes/namespace.yml new file mode 100644 index 0000000..6473f29 --- /dev/null +++ b/kubernetes/namespace.yml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: spring-cloud-kubernetes-demo \ No newline at end of file diff --git a/kubernetes/redis.yml b/kubernetes/redis.yml index 20c7cfb..39422bb 100644 --- a/kubernetes/redis.yml +++ b/kubernetes/redis.yml @@ -2,6 +2,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: redis + namespace: spring-cloud-kubernetes-demo spec: replicas: 1 selector: @@ -25,6 +26,7 @@ kind: Service apiVersion: v1 metadata: name: redis-svc + namespace: spring-cloud-kubernetes-demo spec: selector: app: redis diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index 57e1512..ae22fac 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -2,6 +2,7 @@ kind: ConfigMap apiVersion: v1 metadata: name: ui-interface + namespace: spring-cloud-kubernetes-demo data: application.yaml: |- server: @@ -33,6 +34,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: ui-interface + namespace: spring-cloud-kubernetes-demo labels: app: ui-interface spec: @@ -76,6 +78,7 @@ kind: Service apiVersion: v1 metadata: name: ui-interface + namespace: spring-cloud-kubernetes-demo spec: selector: app: ui-interface @@ -88,6 +91,7 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ui-interface-ingress + namespace: spring-cloud-kubernetes-demo spec: rules: - http: From 6156545ef426349fe972a67b4a4d1eaa570fc2e0 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Fri, 30 Sep 2022 22:04:46 +0200 Subject: [PATCH 12/27] [skip ci] --- kubernetes/hello-service.yml | 2 +- kubernetes/message-service.yml | 2 +- kubernetes/ui-interface.yml | 3 ++- kubernetes/uninstall.sh | 3 +++ 4 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 kubernetes/uninstall.sh diff --git a/kubernetes/hello-service.yml b/kubernetes/hello-service.yml index 77badb1..bbb8dc5 100644 --- a/kubernetes/hello-service.yml +++ b/kubernetes/hello-service.yml @@ -35,7 +35,7 @@ spec: spec: containers: - name: hello-service - image: mrflick72/hello-service:latest + image: mrflick72/hello-service:revamp ports: - containerPort: 8080 diff --git a/kubernetes/message-service.yml b/kubernetes/message-service.yml index 3e49042..e49a344 100644 --- a/kubernetes/message-service.yml +++ b/kubernetes/message-service.yml @@ -40,7 +40,7 @@ spec: spec: containers: - name: message-service - image: mrflick72/message-service:latest + image: mrflick72/message-service:revamp ports: - containerPort: 8080 diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index ae22fac..62a2783 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -54,7 +54,7 @@ spec: spec: containers: - name: ui-interface - image: mrflick72/ui-interface:latest + image: mrflick72/ui-interface:revamp ports: - containerPort: 8080 livenessProbe: @@ -103,3 +103,4 @@ spec: name: ui-interface port: number: 8080 + host: spring-cloud-kubernetes-demo.com \ No newline at end of file diff --git a/kubernetes/uninstall.sh b/kubernetes/uninstall.sh new file mode 100644 index 0000000..fda8b4e --- /dev/null +++ b/kubernetes/uninstall.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +kubectl delete namespace spring-cloud-kubernetes-demo \ No newline at end of file From e757e445452336ec68db540a5d53b18713d5a7a9 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:00:01 +0200 Subject: [PATCH 13/27] service acount --- kubernetes/ui-interface.yml | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index 62a2783..14a30ca 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -6,7 +6,7 @@ metadata: data: application.yaml: |- server: - use-forward-headers: true + forward-headers-strategy: framework spring: redis: @@ -103,4 +103,35 @@ spec: name: ui-interface port: number: 8080 - host: spring-cloud-kubernetes-demo.com \ No newline at end of file + host: spring-cloud-kubernetes-demo.com + tls: + - secretName: vvaudi-lab.com-letsencrypt + hosts: + - spring-cloud-kubernetes-demo.vvaudi-lab.com +--- + +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + namespace: spring-cloud-kubernetes-demo + name: namespace-reader +rules: + - apiGroups: [""] + resources: ["configmaps", "pods", "services", "endpoints", "secrets"] + verbs: ["get", "list", "watch"] + +--- + +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: namespace-reader-binding + namespace: spring-cloud-kubernetes-demo +subjects: + - kind: ServiceAccount + name: default + apiGroup: "" +roleRef: + kind: Role + name: namespace-reader + apiGroup: "" \ No newline at end of file From 2da7170aced5086c59a72e7070fdbcb6fe016ef1 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:00:36 +0200 Subject: [PATCH 14/27] service acount --- kubernetes/install.sh | 1 + kubernetes/service-account.yml | 26 ++++++++++++++++++++++++++ kubernetes/ui-interface.yml | 29 +---------------------------- 3 files changed, 28 insertions(+), 28 deletions(-) create mode 100644 kubernetes/service-account.yml diff --git a/kubernetes/install.sh b/kubernetes/install.sh index a46c39b..5ae97a4 100644 --- a/kubernetes/install.sh +++ b/kubernetes/install.sh @@ -1,6 +1,7 @@ #!/bin/bash kubectl apply -f namespace.yml +kubectl apply -f service-account.yml kubectl apply -f mongo.yml kubectl apply -f redis.yml diff --git a/kubernetes/service-account.yml b/kubernetes/service-account.yml new file mode 100644 index 0000000..84df994 --- /dev/null +++ b/kubernetes/service-account.yml @@ -0,0 +1,26 @@ + +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + namespace: spring-cloud-kubernetes-demo + name: namespace-reader +rules: + - apiGroups: [""] + resources: ["configmaps", "pods", "services", "endpoints", "secrets"] + verbs: ["get", "list", "watch"] + +--- + +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: namespace-reader-binding + namespace: spring-cloud-kubernetes-demo +subjects: + - kind: ServiceAccount + name: default + apiGroup: "" +roleRef: + kind: Role + name: namespace-reader + apiGroup: "" \ No newline at end of file diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index 14a30ca..f3dceee 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -107,31 +107,4 @@ spec: tls: - secretName: vvaudi-lab.com-letsencrypt hosts: - - spring-cloud-kubernetes-demo.vvaudi-lab.com ---- - -kind: Role -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - namespace: spring-cloud-kubernetes-demo - name: namespace-reader -rules: - - apiGroups: [""] - resources: ["configmaps", "pods", "services", "endpoints", "secrets"] - verbs: ["get", "list", "watch"] - ---- - -kind: RoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: namespace-reader-binding - namespace: spring-cloud-kubernetes-demo -subjects: - - kind: ServiceAccount - name: default - apiGroup: "" -roleRef: - kind: Role - name: namespace-reader - apiGroup: "" \ No newline at end of file + - spring-cloud-kubernetes-demo.vvaudi-lab.com \ No newline at end of file From 72e19ffdb17b209199ad2b643f4ac4556bcea9dc Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:03:20 +0200 Subject: [PATCH 15/27] service acount --- hello-service/Dockerfile | 2 +- message-service/Dockerfile | 2 +- ui/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hello-service/Dockerfile b/hello-service/Dockerfile index cad4b56..d6b8963 100644 --- a/hello-service/Dockerfile +++ b/hello-service/Dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:11 +FROM openjdk:17 ADD build/libs/hello-service.jar /usr/local/hello-service/ diff --git a/message-service/Dockerfile b/message-service/Dockerfile index c44f0b8..8ef852c 100644 --- a/message-service/Dockerfile +++ b/message-service/Dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:11 +FROM openjdk:17 ADD build/libs/message-service.jar /usr/local/message-service/ diff --git a/ui/Dockerfile b/ui/Dockerfile index 2cda6c6..cddcc54 100644 --- a/ui/Dockerfile +++ b/ui/Dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:11 +FROM openjdk:17 ADD target/ui-interface.jar /usr/local/ui-interface/ From bff4aa20503e6bfe1f2854a08f576eb4cbe7b5d8 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:16:18 +0200 Subject: [PATCH 16/27] service acount --- hello-service/Dockerfile | 2 +- message-service/Dockerfile | 2 +- ui/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hello-service/Dockerfile b/hello-service/Dockerfile index d6b8963..0e89654 100644 --- a/hello-service/Dockerfile +++ b/hello-service/Dockerfile @@ -6,4 +6,4 @@ WORKDIR /usr/local/hello-service/ EXPOSE 8080 -CMD ["java", "-Xms512m", "-Xmx1g", "-jar", "hello-service.jar"] \ No newline at end of file +CMD ["java", "-jar", "hello-service.jar"] \ No newline at end of file diff --git a/message-service/Dockerfile b/message-service/Dockerfile index 8ef852c..7990e98 100644 --- a/message-service/Dockerfile +++ b/message-service/Dockerfile @@ -6,4 +6,4 @@ WORKDIR /usr/local/message-service/ EXPOSE 8080 -CMD ["java", "-Xms512m", "-Xmx1g", "-jar", "message-service.jar"] \ No newline at end of file +CMD ["java", "-jar", "message-service.jar"] \ No newline at end of file diff --git a/ui/Dockerfile b/ui/Dockerfile index cddcc54..b6176b2 100644 --- a/ui/Dockerfile +++ b/ui/Dockerfile @@ -6,4 +6,4 @@ WORKDIR /usr/local/ui-interface/ EXPOSE 8080 -CMD ["java", "-Xms512m", "-Xmx1g", "-jar", "ui-interface.jar"] \ No newline at end of file +CMD ["java", "-jar", "ui-interface.jar"] \ No newline at end of file From 196f028989a540d32386c8d879bcf8cd0a74d3e8 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:27:55 +0200 Subject: [PATCH 17/27] service acount --- kubernetes/hello-service.yml | 1 + kubernetes/message-service.yml | 1 + kubernetes/ui-interface.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/kubernetes/hello-service.yml b/kubernetes/hello-service.yml index bbb8dc5..ad2f012 100644 --- a/kubernetes/hello-service.yml +++ b/kubernetes/hello-service.yml @@ -36,6 +36,7 @@ spec: containers: - name: hello-service image: mrflick72/hello-service:revamp + pullPolicy: Always ports: - containerPort: 8080 diff --git a/kubernetes/message-service.yml b/kubernetes/message-service.yml index e49a344..3fe7c49 100644 --- a/kubernetes/message-service.yml +++ b/kubernetes/message-service.yml @@ -41,6 +41,7 @@ spec: containers: - name: message-service image: mrflick72/message-service:revamp + pullPolicy: Always ports: - containerPort: 8080 diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index f3dceee..e866a5e 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -55,6 +55,7 @@ spec: containers: - name: ui-interface image: mrflick72/ui-interface:revamp + pullPolicy: Always ports: - containerPort: 8080 livenessProbe: From ac584d8f04b200907ea545dec253875e76f0b1ae Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:29:12 +0200 Subject: [PATCH 18/27] service acount --- kubernetes/hello-service.yml | 2 +- kubernetes/message-service.yml | 2 +- kubernetes/ui-interface.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kubernetes/hello-service.yml b/kubernetes/hello-service.yml index ad2f012..ed6513e 100644 --- a/kubernetes/hello-service.yml +++ b/kubernetes/hello-service.yml @@ -36,7 +36,7 @@ spec: containers: - name: hello-service image: mrflick72/hello-service:revamp - pullPolicy: Always + imagePullPolicy: Always ports: - containerPort: 8080 diff --git a/kubernetes/message-service.yml b/kubernetes/message-service.yml index 3fe7c49..7fef6b9 100644 --- a/kubernetes/message-service.yml +++ b/kubernetes/message-service.yml @@ -41,7 +41,7 @@ spec: containers: - name: message-service image: mrflick72/message-service:revamp - pullPolicy: Always + imagePullPolicy: Always ports: - containerPort: 8080 diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index e866a5e..9c9b936 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -55,7 +55,7 @@ spec: containers: - name: ui-interface image: mrflick72/ui-interface:revamp - pullPolicy: Always + imagePullPolicy: Always ports: - containerPort: 8080 livenessProbe: From f87066e955ba61e9578f42fbdf2926abd15b20f7 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:36:03 +0200 Subject: [PATCH 19/27] service acount --- kubernetes/ui-interface.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index 9c9b936..bf7cc9c 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -104,7 +104,7 @@ spec: name: ui-interface port: number: 8080 - host: spring-cloud-kubernetes-demo.com + host: spring-cloud-kubernetes-demo.vvaudi-lab.com tls: - secretName: vvaudi-lab.com-letsencrypt hosts: From b62b63f6e289694985aa69c6dadb2f0508870448 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:40:39 +0200 Subject: [PATCH 20/27] service acount --- kubernetes/ui-interface.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index bf7cc9c..ad29ef3 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -93,6 +93,11 @@ kind: Ingress metadata: name: ui-interface-ingress namespace: spring-cloud-kubernetes-demo + annotations: + kubernetes.io/ingress.class: "haproxy" + kubernetes.io/tls-acme: "true" + cert-manager.io/cluster-issuer: vvaudi-lab.com-letsencrypt + spec: rules: - http: From 4f0f6a508759dcc04096710b6387aa8231a48f02 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 01:46:27 +0200 Subject: [PATCH 21/27] service acount --- kubernetes/hello-service.yml | 3 ++- kubernetes/message-service.yml | 1 + kubernetes/ui-interface.yml | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/kubernetes/hello-service.yml b/kubernetes/hello-service.yml index ed6513e..e932552 100644 --- a/kubernetes/hello-service.yml +++ b/kubernetes/hello-service.yml @@ -67,4 +67,5 @@ spec: app: hello-service ports: - protocol: TCP - port: 8080 \ No newline at end of file + port: 8080 + name: http \ No newline at end of file diff --git a/kubernetes/message-service.yml b/kubernetes/message-service.yml index 7fef6b9..ef56649 100644 --- a/kubernetes/message-service.yml +++ b/kubernetes/message-service.yml @@ -73,3 +73,4 @@ spec: ports: - protocol: TCP port: 8080 + name: http diff --git a/kubernetes/ui-interface.yml b/kubernetes/ui-interface.yml index ad29ef3..5a5279e 100644 --- a/kubernetes/ui-interface.yml +++ b/kubernetes/ui-interface.yml @@ -86,6 +86,7 @@ spec: ports: - protocol: TCP port: 8080 + name: http --- apiVersion: networking.k8s.io/v1 From 2544e23961c12013fdb51ae6dda34d8a6fea5188 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 11:37:38 +0200 Subject: [PATCH 22/27] [skip ci] --- ui/src/main/java/it/valeriovaudi/ui/UiApplication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java index 9728232..d1b4560 100644 --- a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java +++ b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java @@ -40,13 +40,13 @@ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) public MapReactiveUserDetailsService userDetailsService() { UserDetails user = User.builder() .username("user") - .password("secret") + .password("{noop}secret") .roles("USER") .build(); UserDetails admin = User.builder() .username("admin") - .password("secret") + .password("{noop}secret") .roles("ADMIN") .build(); From 0cc56ac3a85c6b6c6847a5f55d332363a57b67d5 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 12:05:52 +0200 Subject: [PATCH 23/27] [skip ci] --- .../valeriovaudi/helloservice/HelloServiceApplication.java | 4 ++-- ui/src/main/java/it/valeriovaudi/ui/UiApplication.java | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/hello-service/src/main/java/it/valeriovaudi/helloservice/HelloServiceApplication.java b/hello-service/src/main/java/it/valeriovaudi/helloservice/HelloServiceApplication.java index 493e62b..c8cbca9 100644 --- a/hello-service/src/main/java/it/valeriovaudi/helloservice/HelloServiceApplication.java +++ b/hello-service/src/main/java/it/valeriovaudi/helloservice/HelloServiceApplication.java @@ -19,7 +19,7 @@ import java.util.UUID; import static java.lang.String.format; -import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.BodyInserters.*; import static org.springframework.web.reactive.function.server.ServerResponse.ok; import static reactor.core.publisher.Mono.just; @@ -81,6 +81,6 @@ public RouterFunction routerFunction() { private HandlerFunction sayHelloHandler() { return request -> helloService.sayHello(request.pathVariable("name")) - .flatMap(helloMessage -> ok().body(fromObject(helloMessage))); + .flatMap(helloMessage -> ok().body(fromProducer(helloMessage, String.class))); } } diff --git a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java index d1b4560..f2f8a25 100644 --- a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java +++ b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java @@ -39,14 +39,16 @@ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) @Bean public MapReactiveUserDetailsService userDetailsService() { UserDetails user = User.builder() + .passwordEncoder(pswd -> pswd) .username("user") - .password("{noop}secret") + .password("secret") .roles("USER") .build(); UserDetails admin = User.builder() + .passwordEncoder(pswd -> pswd) .username("admin") - .password("{noop}secret") + .password("secret") .roles("ADMIN") .build(); From 1c2cba98881fd14c864c12881543746acf1e8887 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 12:07:13 +0200 Subject: [PATCH 24/27] password encoding --- ui/src/main/java/it/valeriovaudi/ui/UiApplication.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java index f2f8a25..9728232 100644 --- a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java +++ b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java @@ -39,14 +39,12 @@ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) @Bean public MapReactiveUserDetailsService userDetailsService() { UserDetails user = User.builder() - .passwordEncoder(pswd -> pswd) .username("user") .password("secret") .roles("USER") .build(); UserDetails admin = User.builder() - .passwordEncoder(pswd -> pswd) .username("admin") .password("secret") .roles("ADMIN") From 2defa6cbc74e489bbc60ad8ab0d600f7e95c2273 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 12:12:33 +0200 Subject: [PATCH 25/27] password encoding --- ui/src/main/java/it/valeriovaudi/ui/UiApplication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java index 9728232..d1b4560 100644 --- a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java +++ b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java @@ -40,13 +40,13 @@ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) public MapReactiveUserDetailsService userDetailsService() { UserDetails user = User.builder() .username("user") - .password("secret") + .password("{noop}secret") .roles("USER") .build(); UserDetails admin = User.builder() .username("admin") - .password("secret") + .password("{noop}secret") .roles("ADMIN") .build(); From 9649aea12e80cb7cd7fc6126f4a451b67a107e29 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 12:23:02 +0200 Subject: [PATCH 26/27] password encoding --- .../it/valeriovaudi/helloservice/HelloServiceApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hello-service/src/main/java/it/valeriovaudi/helloservice/HelloServiceApplication.java b/hello-service/src/main/java/it/valeriovaudi/helloservice/HelloServiceApplication.java index c8cbca9..88088ca 100644 --- a/hello-service/src/main/java/it/valeriovaudi/helloservice/HelloServiceApplication.java +++ b/hello-service/src/main/java/it/valeriovaudi/helloservice/HelloServiceApplication.java @@ -81,6 +81,6 @@ public RouterFunction routerFunction() { private HandlerFunction sayHelloHandler() { return request -> helloService.sayHello(request.pathVariable("name")) - .flatMap(helloMessage -> ok().body(fromProducer(helloMessage, String.class))); + .flatMap(helloMessage -> ok().body(fromValue(helloMessage))); } } From a4f114ab6e524b25be48637f095054b5b2d3f1f5 Mon Sep 17 00:00:00 2001 From: mrflick72 Date: Sat, 1 Oct 2022 18:01:15 +0200 Subject: [PATCH 27/27] read me --- README.md | 43 +++++++++++-------------------------------- config.yml | 32 -------------------------------- 2 files changed, 11 insertions(+), 64 deletions(-) delete mode 100644 config.yml diff --git a/README.md b/README.md index 5145bbf..edc8b7d 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ In this project you can see used many technologies like: * Spring Cloud LoadBalancer * Spring Reactive Data Mongo * Spring WebFlux -* Spring Boot 2.4.x +* Spring Boot 2.7.x * Spring Session * Spring Reactive Security * Java/Kotlin @@ -74,11 +74,12 @@ benefit of the *LoadBalancerExchangeFilterFunction* injected by spring for us. T ... - @Bean - @LoadBalanced - public WebClient webClient() { - return WebClient.builder().build(); - } + @Bean + @LoadBalanced + public WebClient.Builder loadBalancedWebClientBuilder() { + return WebClient.builder(); + } + } ``` #### service integration @@ -101,8 +102,8 @@ class HelloService { } ``` -The application.yml configuration provided via config map for kubernetes profile and application-netflix.yml for netflix profile. The benefit of use configmap -with kubernetes is that configuring restart actuator endpoint with spring cloud kubernetes configuration in the bootstrap.yml, we can benefit of a hot reload configuration mechanism +The application.yml configuration provided via config map. The benefit of use configmap +with Spring Cloud Kubernetes is that configuring restart actuator endpoint with spring cloud kubernetes configuration in the application.yml, we can benefit of a hot reload configuration mechanism via Spring application context restart. The application is totally reactive and no blocking io. It involved: @@ -122,7 +123,7 @@ you can use this command: Remember to enable ingress with this command: ```minikube addons enable ingress -p spring-cloud-k8s``` In order to test on minikube you can use my docker images on docker hub and that's it install the kubernetes manifests under kubernetes folder. -Pay attention before to install all k8s descriptors is needed to apply a command like this: `kubectl create clusterrolebinding admin --clusterrole=cluster-admin --serviceaccount=default:default` +Pay attention before to install all k8s descriptors is needed to apply a command like this: `kubectl apply -f service-account.yml` The command is needed due to Spring Cloud Kubernetes interacts with Kubernetes api, without run this command you will get an error like below: ``` There was an unexpected error (type=Internal Server Error, status=500). @@ -136,26 +137,4 @@ Failure executing: GET at: https://10.96.0.1/api/v1/namespaces/default/endpoints Forbidden!Configured service account doesn't have access. Service account may have been revoked. endpoints "message-service" is forbidden: User "system:serviceaccount:default:default" cannot get resource "endpoints" in API group "" in the namespace "default". -``` -## Conclusion - -Now!, what street choose?, Spring Cloud Netflix or Spring Cloud Kubernetes? Of course the right answer is it depends! - -With Spring Cloud abstraction you can achieve many typical distributed system pattern like: service discovery, client side load balancing and configuration load in a Netflix or Kubernetes environment without -change one line of code, giving you the possibility to choose later the your way: K8S or not to K8S. Said that, the choice depends form -requirements, infrastructure already on place and many other concern. The my impression is: very cool the possibility of choose later and test in local, on premise or in the cloud with -Netflix or on K8s with the assurance that the application behaviour will be near the same, I have particularly appreciated the simple hot reload of application configuration on K8s. -But on the other hands using Spring Cloud Kubernetes for service discovery and client load balancing, that are the main features exposed by Spring Cloud Kubernetes, -it is an overkill especially considering that those features that are already built in in K8s. - -Moreover considering that the application have to talk with master for applying the api, it can be quite dangerous due to too much knowledge on your application of infrastructure -and the risk of coupling your application framework with the infrastructure it is a bad thing in my opinion. The real power is choose later not copling for ever to a platform or to a framework. - -At the end if your application run on a public cloud provider use Spring Cloud Netflix can be a very convenient choice otherwise use Kubernetes may be a real popular and farsighted choice, -especially considering the real cool project pluggable on top of Kubernetes like Istio, Knative and considering that more and more providers are adopting Kubernetes, -AWS EKS, Google Cloud GKE, Pivotal PKS and many other are an example. - -Unfortunately there not exist a correct answer, there exist only use case in wich a choice fit or not. Like in many use case the -possibility of choice later and fast adopting a new way that is more capable for embrace business changing is a winner choice. - -In this direction, in my opinion, Spring Cloud win due to give us the possibility to choose later if adopting Netflix or Kubernetes at any time and go up and forward in any time. +``` \ No newline at end of file diff --git a/config.yml b/config.yml deleted file mode 100644 index 5492a7d..0000000 --- a/config.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: 2.1 - -jobs: - build: - machine: - image: ubuntu-2004:202008-01 - docker_layer_caching: true - - steps: - - checkout - - - run: - name: docker login - command: | - docker login -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_PASSWORD - - - run: - name: build ui service - command: | - cd ui - mvn clean install docker:build docker:push - - - run: - name: build hello-service - command: | - cd hello-service - ./gradlew build docker dockerPush - - run: - name: build message-service - command: | - cd message-service - ./gradlew build docker dockerPush \ No newline at end of file