From e97ed04c941a43297cd37058883a60b1e72ea5bb Mon Sep 17 00:00:00 2001 From: Kai Zimmermann Date: Thu, 27 Oct 2016 08:24:26 +0200 Subject: [PATCH] Adapted sandbox setup to current master (#327) Signed-off-by: kaizimmerm --- deployHawkBitSandbox.sh | 3 +- .../hawkbit-device-simulator/cf/manifest.yml | 2 +- .../cf/manifest-simple.yml | 2 +- examples/hawkbit-example-app/cf/manifest.yml | 2 +- .../hawkbit/app/RedirectController.java | 30 ++++++++++++++++++ .../application-cloudsandbox.properties | 5 +++ .../src/main/resources/application.properties | 3 +- .../themes/hawkbit/customstyles/common.scss | 14 ++++---- .../customstyles/hawkbitvariables.scss | 12 +++++-- .../themes/hawkbit/images/hawkbit_logo.png | Bin 0 -> 8517 bytes 10 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/RedirectController.java create mode 100644 hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/images/hawkbit_logo.png diff --git a/deployHawkBitSandbox.sh b/deployHawkBitSandbox.sh index d774f4205..ac724e5da 100644 --- a/deployHawkBitSandbox.sh +++ b/deployHawkBitSandbox.sh @@ -11,10 +11,11 @@ # data example to a cloud foundry enviroment. Expects existing CF CLI # installation and login to be existing already. +cf stop hawkbit-simulator cd examples/hawkbit-example-app/target/ cf push cd ../.. -java -jar hawkbit-mgmt-api-client/target/hawkbit-mgmt-api-client-0.2.0-SNAPSHOT.jar --hawkbit.url=hawkbit.eu-gb.mybluemix.net +java -jar hawkbit-example-mgmt-simulator/target/hawkbit-example-mgmt-simulator-0.2.0-SNAPSHOT.jar --hawkbit.url=https://hawkbit.eu-gb.mybluemix.net cd hawkbit-device-simulator/target/ cf push cd ../../.. diff --git a/examples/hawkbit-device-simulator/cf/manifest.yml b/examples/hawkbit-device-simulator/cf/manifest.yml index 188ef7780..efc18ab45 100644 --- a/examples/hawkbit-device-simulator/cf/manifest.yml +++ b/examples/hawkbit-device-simulator/cf/manifest.yml @@ -13,7 +13,7 @@ applications: memory: 1024M instances: 1 buildpack: https://github.com/cloudfoundry/java-buildpack - path: ${project.build.finalName}.jar + path: @project.build.finalName@.jar services: - dmf-rabbit env: diff --git a/examples/hawkbit-example-app/cf/manifest-simple.yml b/examples/hawkbit-example-app/cf/manifest-simple.yml index c87a533f4..e367742aa 100644 --- a/examples/hawkbit-example-app/cf/manifest-simple.yml +++ b/examples/hawkbit-example-app/cf/manifest-simple.yml @@ -13,7 +13,7 @@ applications: memory: 1024M instances: 1 buildpack: https://github.com/cloudfoundry/java-buildpack - path: ${project.build.finalName}.jar + path: @project.build.finalName@.jar env: SPRING_PROFILES_ACTIVE: cloudsandbox CF_STAGING_TIMEOUT: 15 diff --git a/examples/hawkbit-example-app/cf/manifest.yml b/examples/hawkbit-example-app/cf/manifest.yml index 2145f467d..a1401afbc 100644 --- a/examples/hawkbit-example-app/cf/manifest.yml +++ b/examples/hawkbit-example-app/cf/manifest.yml @@ -13,7 +13,7 @@ applications: memory: 1024M instances: 1 buildpack: https://github.com/cloudfoundry/java-buildpack - path: ${project.build.finalName}.jar + path: @project.build.finalName@.jar services: - dmf-rabbit env: diff --git a/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/RedirectController.java b/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/RedirectController.java new file mode 100644 index 000000000..e4cb0d820 --- /dev/null +++ b/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/RedirectController.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations GmbH and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.eclipse.hawkbit.app; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + * Redirects for convenience of the example apps users. hawkBit's management UI + * is by default not listening on / but on /UI. + * + */ +@Controller +public class RedirectController { + + /** + * @return redirect to the Management UI + */ + @RequestMapping("/") + public ModelAndView home() { + return new ModelAndView("redirect:/UI/"); + } +} diff --git a/examples/hawkbit-example-app/src/main/resources/application-cloudsandbox.properties b/examples/hawkbit-example-app/src/main/resources/application-cloudsandbox.properties index 85c47cb8f..85dfb02ee 100644 --- a/examples/hawkbit-example-app/src/main/resources/application-cloudsandbox.properties +++ b/examples/hawkbit-example-app/src/main/resources/application-cloudsandbox.properties @@ -7,6 +7,11 @@ # http://www.eclipse.org/legal/epl-v10.html # +security.require-ssl=true +server.tomcat.protocol-header=X-Forwarded-Proto +# IBM Adresses unpredictable +server.tomcat.internal-proxies=.* + vaadin.servlet.productionMode=true ## Configuration for building download URLs - START diff --git a/examples/hawkbit-example-mgmt-simulator/src/main/resources/application.properties b/examples/hawkbit-example-mgmt-simulator/src/main/resources/application.properties index c42dbb111..881df6e81 100644 --- a/examples/hawkbit-example-mgmt-simulator/src/main/resources/application.properties +++ b/examples/hawkbit-example-mgmt-simulator/src/main/resources/application.properties @@ -21,4 +21,5 @@ hawkbit.scenarios.[0].ds-name=gettingstarted-example hawkbit.scenarios.[0].distribution-sets=3 hawkbit.scenarios.[0].sm-fw-name=gettingstarted-example hawkbit.scenarios.[0].sm-sw-name=gettingstarted-example -hawkbit.scenarios.[0].runRollouts=false \ No newline at end of file +hawkbit.scenarios.[0].runRollouts=false +hawkbit.scenarios.[0].artifactsPerSM=0 diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/common.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/common.scss index ecacdcd67..090a3af8a 100644 --- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/common.scss +++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/common.scss @@ -86,7 +86,7 @@ } .view-header:after { background: $logo-image no-repeat right top; - background-position: right 0 top 8px; + background-position: $logo-position; content: ""; height: 80px; position: absolute; @@ -143,15 +143,15 @@ .valo-menu-title { line-height: 1.2; } - + .v-menubar-user-menu:after { display: none; } - + .v-menubar-menuitem-user-menuitem { width: 100%; } - + .v-menubar-user-menu > .v-menubar-menuitem { white-space: normal !important; .v-icon { @@ -282,15 +282,15 @@ .links { padding-left: 22px; } - + .font-icon{ font-family:FontAwesome; font-style:normal; font-weight:normal; } - + .form-lastrow { padding-bottom: 12px !important; } - + } diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/hawkbitvariables.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/hawkbitvariables.scss index 96e6d9132..477134281 100644 --- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/hawkbitvariables.scss +++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/hawkbitvariables.scss @@ -10,6 +10,12 @@ $hawkbit-primary-color: #551f62; $hawkbit-primary-color-light: #551f62; +//Logo image for the top right corner +$logo-image: url('images/hawkbit_logo.png'); + +//Logo image postion +$logo-position: right 8px top 8px; + //Application text font size.All widget text style are computed based on this $app-text-font-size: 16px; @@ -76,7 +82,7 @@ $accordion-action-history-title-color: #551f62; //Success icon color on valid target filter query $success-icon-color: #ff0000; -//Error icon color on invalid target filter query +//Error icon color on invalid target filter query $error-icon-color: #008000; @@ -133,8 +139,8 @@ $twin-table-border-grey:#888; $progress-bar-scheduled-part: $blue-color; -$progress-bar-running-part: $signal-yellow-color; +$progress-bar-running-part: $signal-yellow-color; $progress-bar-error-part: $signal-red-color; $progress-bar-finished-part: $signal-green-color; $progress-bar-cancelled-part: $grey-light; -$progress-bar-notstarted-part: $grey-color; \ No newline at end of file +$progress-bar-notstarted-part: $grey-color; diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/images/hawkbit_logo.png b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/images/hawkbit_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..21af5c30a01009d2466da262773e34bb2eab8c26 GIT binary patch literal 8517 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 literal 0 HcmV?d00001