├── _config.yml ├── scaleway-ui.png ├── dist ├── component.css ├── scaleway.svg └── component.js ├── component ├── component.css ├── component.js └── template.hbs ├── .gitignore ├── bower.json ├── .editorconfig ├── .jshintrc ├── package.json ├── README.md ├── gulpfile.js └── assets └── scaleway.svg /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /scaleway-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitcdh/ui-driver-scaleway/HEAD/scaleway-ui.png -------------------------------------------------------------------------------- /dist/component.css: -------------------------------------------------------------------------------- 1 | .machine-driver.scaleway { 2 | background-image: url('scaleway.svg'); 3 | } 4 | -------------------------------------------------------------------------------- /component/component.css: -------------------------------------------------------------------------------- 1 | .machine-driver.%%DRIVERNAME%% { 2 | background-image: url('%%DRIVERNAME%%.svg'); 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /tmp 5 | 6 | # dependencies 7 | /node_modules 8 | /bower_components 9 | 10 | # misc 11 | /.sass-cache 12 | /connect.lock 13 | /coverage/* 14 | /libpeerconnection.log 15 | npm-debug.log 16 | testem.log 17 | .DS_Store 18 | .tern-port 19 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui-custom-driver-composer", 3 | "description": "A small utility to build custom UI for custom drivers added to the Rancher UI project", 4 | "main": "", 5 | "authors": [ 6 | "Westly Wright " 7 | ], 8 | "license": "MIT", 9 | "homepage": "https://github.com/westlywright/ui-custom-driver-composer", 10 | "moduleType": [], 11 | "private": true, 12 | "ignore": [ 13 | "**/.*", 14 | "node_modules", 15 | "bower_components", 16 | "test", 17 | "tests" 18 | ], 19 | "dependencies": { 20 | "ember": "2.9.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [*.js] 17 | indent_style = space 18 | indent_size = 2 19 | 20 | [*.hbs] 21 | insert_final_newline = false 22 | indent_style = space 23 | indent_size = 2 24 | 25 | [*.css] 26 | indent_style = space 27 | indent_size = 2 28 | 29 | [*.html] 30 | indent_style = space 31 | indent_size = 2 32 | 33 | [*.{diff,md}] 34 | trim_trailing_whitespace = false 35 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "predef": [ 3 | "document", 4 | "window", 5 | "-Promise", 6 | "jQuery", 7 | "$", 8 | "moment", 9 | "c3","d3", 10 | "Terminal", 11 | "Prism", 12 | "Ui", 13 | "dagreD3", 14 | "async", 15 | "AWS", 16 | "Identicon", 17 | "md5", 18 | "_", 19 | "NoVNC", 20 | "commonmark" 21 | ], 22 | "browser" : true, 23 | "boss" : true, 24 | "curly": true, 25 | "debug": false, 26 | "devel": true, 27 | "eqeqeq": true, 28 | "evil": true, 29 | "forin": false, 30 | "immed": false, 31 | "laxbreak": false, 32 | "newcap": true, 33 | "noarg": true, 34 | "noempty": false, 35 | "nonew": false, 36 | "nomen": false, 37 | "onevar": false, 38 | "plusplus": false, 39 | "regexp": false, 40 | "undef": true, 41 | "sub": true, 42 | "strict": false, 43 | "white": false, 44 | "eqnull": true, 45 | "esnext": true, 46 | "unused": true 47 | } 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui-driver-scaleway", 3 | "version": "0.0.2", 4 | "description": "Rancher UI driver for Scaleway", 5 | "scripts": {}, 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/mitcdh/ui-driver-scaleway.git" 9 | }, 10 | "author": "Mitchell Hewes", 11 | "license": "Apache-2.0", 12 | "bugs": { 13 | "url": "https://github.com/mitcdh/ui-driver-scaleway/issues" 14 | }, 15 | "scripts": { 16 | "start": "./node_modules/.bin/gulp server", 17 | "clean": "./node_modules/.bin/gulp clean", 18 | "build": "./node_modules/.bin/gulp build", 19 | "deploy": "git commit -m \"Release at $(date)\" -- dist && git push" 20 | }, 21 | "homepage": "https://github.com/mitcdh/ui-driver-scaleway#readme", 22 | "devDependencies": { 23 | "del": "^2.2.0", 24 | "gulp": "^3.9.1", 25 | "gulp-clean": "^0.3.2", 26 | "gulp-concat": "^2.6.0", 27 | "gulp-connect": "^3.2.2", 28 | "gulp-htmlbars-compiler": "0.0.2", 29 | "gulp-jshint": "^2.0.0", 30 | "gulp-replace": "^0.5.4", 31 | "gulp-sourcemaps": "^1.6.0", 32 | "gulp-wrap-amd": "^0.5.0", 33 | "jshint": "^2.9.1", 34 | "yargs": "^4.6.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rancher UI for Scaleway Docker-Machine Driver 2 | This is a Rancher UI for the scaleway docker-machine driver. This is unofficial and by no means implies any affiliation with Scaleway, I just wanted my Rancher UI to be a little prettier. 3 | 4 | ![Rancher Scaleway Add Host UI](scaleway-ui.png "Rancher Scaleway Add Host UI") 5 | 6 | ## Setup, Development, Build 7 | Follow the guide in the Rancher repository [ui-driver-skel](https://github.com/rancher/ui-driver-skel) to prepare a build environment. 8 | 9 | The package.json has been customised with the following additional script functions: 10 | 11 | * `deploy`: Pushes a release from the dist subdirectory. 12 | 13 | In practice after making changes the following steps will generate a release: 14 | 15 | 1. `npm run build` 16 | 2. `npm run deploy` 17 | 18 | ## Usage 19 | A release is published to the [GitHub Project Page](https://mitcdh.github.io/ui-driver-scaleway/) for this repository: 20 | 21 | 1. Add a Machine Driver in Rancher (Admin tab -> Settings -> Machine Drivers) 22 | * Download URL: The URL for the `linux_amd64.tar.gz` driver binary from [https://github.com/scaleway/docker-machine-driver-scaleway/releases](https://github.com/scaleway/docker-machine-driver-scaleway/releases) 23 | * Custom UI URL: [https://mitcdh.github.io/ui-driver-scaleway/dist/component.js](https://mitcdh.github.io/ui-driver-scaleway/dist/component.js) 24 | 2. Wait for the driver to become "Active" 25 | 3. In Rancher go to (Infrastructure -> Hosts -> Add Host) and the Scaleway driver and custom UI should show up. 26 | 27 | ## Alternative UI URLs 28 | These are just for reference as an alternative if there is a problem with GH Pages. Rancher seems to require a correct Content-Type for the .svg logo so directly accessing the raw files on github will not work as intended. 29 | 30 | * [https://cdn.rawgit.com/mitcdh/ui-driver-scaleway/master/dist/component.js](https://cdn.rawgit.com/mitcdh/ui-driver-scaleway/master/dist/component.js) 31 | 32 | ## Credits 33 | * [scaleway/docker-machine-driver-scaleway](https://github.com/scaleway/docker-machine-driver-scaleway) 34 | * [rancher/ui-driver-skel](https://github.com/rancher/ui-driver-skel) 35 | -------------------------------------------------------------------------------- /component/component.js: -------------------------------------------------------------------------------- 1 | /* v----- Do not change anything between here 2 | * (the DRIVERNAME placeholder will be automatically replaced during build) */ 3 | define('ui/components/machine/driver-%%DRIVERNAME%%/component', ['exports', 'ember', 'ui/mixins/driver'], function (exports, _ember, _uiMixinsDriver) { 4 | 5 | exports['default'] = _ember['default'].Component.extend(_uiMixinsDriver['default'], { 6 | driverName: '%%DRIVERNAME%%', 7 | /* ^--- And here */ 8 | 9 | // Write your component here, starting with setting 'model' to a machine with your config populated 10 | bootstrap: function() { 11 | let config = this.get('store').createRecord({ 12 | type : '%%DRIVERNAME%%Config', 13 | commercialType: 'VC1S', 14 | region: '', 15 | name: '', 16 | debug: false, 17 | image: 'ubuntu-xenial', 18 | ip: '', 19 | ipv6: false, 20 | organization: '', 21 | token: '', 22 | volumes: '' 23 | }); 24 | 25 | let type = 'host'; 26 | 27 | if (!this.get('useHost')) { 28 | type = 'machine'; 29 | } 30 | 31 | this.set('model', this.get('store').createRecord({ 32 | type: type, 33 | '%%DRIVERNAME%%Config': config, 34 | })); 35 | }, 36 | 37 | // Add custom validation beyond what can be done from the config API schema 38 | validate() { 39 | // Get generic API validation errors 40 | this._super(); 41 | var errors = this.get('errors')||[]; 42 | 43 | if (!this.get('model.%%DRIVERNAME%%Config.commercialType') ) { 44 | errors.push('Specifying a %%DRIVERNAME%% Instance Type is required'); 45 | } 46 | 47 | if (!this.get('model.%%DRIVERNAME%%Config.organization') ) { 48 | errors.push('Specifying a %%DRIVERNAME%% Organization is required'); 49 | } 50 | 51 | if (!this.get('model.%%DRIVERNAME%%Config.token') ) { 52 | errors.push('Specifying a %%DRIVERNAME%% Token is required'); 53 | } 54 | 55 | if (!this.get('model.%%DRIVERNAME%%Config.image') ) { 56 | errors.push('Specifying a %%DRIVERNAME%% Image is required'); 57 | } 58 | 59 | // Set the array of errors for display, 60 | // and return true if saving should continue. 61 | if ( errors.get('length') ) 62 | { 63 | this.set('errors', errors); 64 | return false; 65 | } 66 | else 67 | { 68 | this.set('errors', null); 69 | return true; 70 | } 71 | }, 72 | 73 | // Any computed properties or custom logic can go here 74 | }); 75 | }); 76 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | /* jshint node: true */ 2 | const gulp = require('gulp'); 3 | const clean = require('gulp-clean'); 4 | const gulpConcat = require('gulp-concat'); 5 | const gulpConnect = require('gulp-connect'); 6 | const emCompiler = require('./bower_components/ember/ember-template-compiler'); 7 | const htmlbars = require('gulp-htmlbars-compiler'); 8 | const wrapAmd = require('gulp-wrap-amd'); 9 | const replace = require('gulp-replace'); 10 | const argv = require('yargs').argv; 11 | const pkg = require('./package.json'); 12 | 13 | const NAME_TOKEN = '%%DRIVERNAME%%'; 14 | 15 | const BASE = 'component/'; 16 | const DIST = 'dist/'; 17 | const TMP = 'tmp/'; 18 | const ASSETS = 'assets/'; 19 | const DRIVER_NAME = argv.name || pkg.name.replace(/^ui-driver-/,''); 20 | 21 | console.log('Driver Name:', DRIVER_NAME); 22 | 23 | if (!DRIVER_NAME) { 24 | console.log('Please include a driver name with the --name flag'); 25 | process.exit(1); 26 | } 27 | 28 | gulp.task('default', ['build']); 29 | 30 | gulp.task('watch', function() { 31 | gulp.watch(['./component/*.js', './component/*.hbs', './component/*.css'], ['build']); 32 | }); 33 | 34 | gulp.task('server', ['build', 'watch'], function() { 35 | return gulpConnect.server({ 36 | root: [DIST], 37 | port: process.env.PORT || 3000, 38 | https: false 39 | }); 40 | }); 41 | 42 | gulp.task('clean', function() { 43 | return gulp.src([DIST, TMP], {read: false}) 44 | .pipe(clean()); 45 | }); 46 | 47 | gulp.task('js', function() { 48 | return gulp.src([ 49 | BASE + '*.js' 50 | ]) 51 | .pipe(replace(NAME_TOKEN, DRIVER_NAME)) 52 | .pipe(gulpConcat('component.js',{newLine: ';\n'})) 53 | .pipe(gulp.dest(TMP)); 54 | }); 55 | 56 | gulp.task('css', function() { 57 | return gulp.src([ 58 | BASE + '**.css' 59 | ]) 60 | .pipe(replace(NAME_TOKEN, DRIVER_NAME)) 61 | .pipe(gulpConcat('component.css',{newLine: ';\n'})) 62 | .pipe(gulp.dest(DIST)); 63 | }); 64 | 65 | gulp.task('assets', function() { 66 | return gulp.src(ASSETS+'*') 67 | .pipe(gulp.dest(DIST)); 68 | }); 69 | 70 | gulp.task('compiled', ['js'], function() { 71 | return gulp.src(BASE +'**/*.hbs') 72 | .pipe(replace(NAME_TOKEN, DRIVER_NAME)) 73 | .pipe(htmlbars({compiler: emCompiler})) 74 | .pipe(wrapAmd({ 75 | deps: ['exports', 'ember', 'ui/mixins/driver'], 76 | params: ['exports', '_ember', '_uiMixinsDriver'], 77 | moduleRoot: 'component/', 78 | modulePrefix: 'ui/components/machine/driver-' + DRIVER_NAME + '/' 79 | })) 80 | .pipe(replace( 81 | "return Ember.TEMPLATES['template']", 'exports["default"]' 82 | )) 83 | .pipe(gulpConcat('template.js'), {newLine: ';\n'}) 84 | .pipe(gulp.dest(TMP)); 85 | }); 86 | 87 | gulp.task('build', ['compiled','css','assets'], function() { 88 | return gulp.src([`${TMP}/*.js`]) 89 | .pipe(gulpConcat('component.js',{newLine: ';\n'})) 90 | .pipe(gulp.dest(DIST)) 91 | .pipe(gulpConnect.reload()); 92 | }); 93 | -------------------------------------------------------------------------------- /dist/scaleway.svg: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /assets/scaleway.svg: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /component/template.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{partial "host/add-common"}} 4 | 5 |
6 | API Access 7 |
8 |
9 |
10 | 11 |
12 |
13 | {{input type="text" 14 | class="form-control" 15 | placeholder="Scaleway Organization ID" 16 | value=model.%%DRIVERNAME%%Config.organization 17 | }} 18 |
19 |
20 | 21 |
22 |
23 | {{input type="text" 24 | class="form-control" 25 | placeholder="Scaleway API Token" 26 | value=model.%%DRIVERNAME%%Config.token 27 | }} 28 |
29 |
30 | 31 |
32 | Instance 33 |
34 |
35 |
36 | 37 |
38 |
39 | {{input type="text" 40 | class="form-control" 41 | placeholder="Optionally specify the instance name" 42 | value=model.%%DRIVERNAME%%Config.name 43 | }} 44 |
45 |
46 | 47 |
48 |
49 | {{input type="text" 50 | class="form-control" 51 | placeholder="Specify the location (par1,ams1)" 52 | value=model.%%DRIVERNAME%%Config.region 53 | }} 54 |
55 |
56 |
57 |
58 | 59 |
60 |
61 | {{input type="text" 62 | class="form-control" 63 | placeholder="Specify the image" 64 | value=model.%%DRIVERNAME%%Config.image 65 | }} 66 |
67 |
68 | 69 |
70 |
71 | {{input type="text" 72 | class="form-control" 73 | placeholder="Specify the commercial type" 74 | value=model.%%DRIVERNAME%%Config.commercialType 75 | }} 76 |
77 |
78 |
79 |
80 | 81 |
82 |
83 | {{input type="text" 84 | class="form-control" 85 | placeholder="Attach additional volume (e.g., 50G)" 86 | value=model.%%DRIVERNAME%%Config.volumes 87 | }} 88 |
89 |
90 | 91 |
92 | Network 93 |
94 |
95 |
96 | 97 |
98 |
99 | {{input type="text" 100 | class="form-control" 101 | placeholder="Optionally specify the IP Address" 102 | value=model.%%DRIVERNAME%%Config.ip 103 | }} 104 |
105 |
106 | 107 |
108 |
109 | {{input type="checkbox" 110 | checked=model.%%DRIVERNAME%%Config.ipv6 111 | }} 112 |
113 |
114 | 115 |
116 | Debug 117 |
118 |
119 |
120 | 121 |
122 |
123 | {{input type="checkbox" 124 | checked=model.%%DRIVERNAME%%Config.debug 125 | }} 126 |
127 |
128 | 129 | {{!-- This partial contains the Labels and Advanced Options fields --}} 130 | {{partial "host/add-options"}} 131 |
132 | 133 | {{!-- This component shows errors produced by validate() in the component --}} 134 | {{top-errors errors=errors}} 135 | 136 | {{!-- This component shows the Create and Cancel buttons --}} 137 | {{save-cancel save="save" cancel="cancel"}} 138 |
139 | -------------------------------------------------------------------------------- /dist/component.js: -------------------------------------------------------------------------------- 1 | /* v----- Do not change anything between here 2 | * (the DRIVERNAME placeholder will be automatically replaced during build) */ 3 | define('ui/components/machine/driver-scaleway/component', ['exports', 'ember', 'ui/mixins/driver'], function (exports, _ember, _uiMixinsDriver) { 4 | 5 | exports['default'] = _ember['default'].Component.extend(_uiMixinsDriver['default'], { 6 | driverName: 'scaleway', 7 | /* ^--- And here */ 8 | 9 | // Write your component here, starting with setting 'model' to a machine with your config populated 10 | bootstrap: function() { 11 | let config = this.get('store').createRecord({ 12 | type : 'scalewayConfig', 13 | commercialType: 'VC1S', 14 | region: '', 15 | name: '', 16 | debug: false, 17 | image: 'ubuntu-xenial', 18 | ip: '', 19 | ipv6: false, 20 | organization: '', 21 | token: '', 22 | volumes: '' 23 | }); 24 | 25 | let type = 'host'; 26 | 27 | if (!this.get('useHost')) { 28 | type = 'machine'; 29 | } 30 | 31 | this.set('model', this.get('store').createRecord({ 32 | type: type, 33 | 'scalewayConfig': config, 34 | })); 35 | }, 36 | 37 | // Add custom validation beyond what can be done from the config API schema 38 | validate() { 39 | // Get generic API validation errors 40 | this._super(); 41 | var errors = this.get('errors')||[]; 42 | 43 | if (!this.get('model.scalewayConfig.commercialType') ) { 44 | errors.push('Specifying a scaleway Instance Type is required'); 45 | } 46 | 47 | if (!this.get('model.scalewayConfig.organization') ) { 48 | errors.push('Specifying a scaleway Organization is required'); 49 | } 50 | 51 | if (!this.get('model.scalewayConfig.token') ) { 52 | errors.push('Specifying a scaleway Token is required'); 53 | } 54 | 55 | if (!this.get('model.scalewayConfig.image') ) { 56 | errors.push('Specifying a scaleway Image is required'); 57 | } 58 | 59 | // Set the array of errors for display, 60 | // and return true if saving should continue. 61 | if ( errors.get('length') ) 62 | { 63 | this.set('errors', errors); 64 | return false; 65 | } 66 | else 67 | { 68 | this.set('errors', null); 69 | return true; 70 | } 71 | }, 72 | 73 | // Any computed properties or custom logic can go here 74 | }); 75 | }); 76 | ; 77 | define("ui/components/machine/driver-scaleway/template",["exports","ember","ui/mixins/driver"],function(exports,_ember,_uiMixinsDriver){ 78 | 79 | exports["default"] = Ember.HTMLBars.template((function() { 80 | return { 81 | meta: { 82 | "revision": "Ember@2.9.1", 83 | "loc": { 84 | "source": null, 85 | "start": { 86 | "line": 1, 87 | "column": 0 88 | }, 89 | "end": { 90 | "line": 139, 91 | "column": 0 92 | } 93 | } 94 | }, 95 | isEmpty: false, 96 | arity: 0, 97 | cachedFragment: null, 98 | hasRendered: false, 99 | buildFragment: function buildFragment(dom) { 100 | var el0 = dom.createDocumentFragment(); 101 | var el1 = dom.createElement("section"); 102 | dom.setAttribute(el1,"class","horizontal-form"); 103 | var el2 = dom.createTextNode("\n "); 104 | dom.appendChild(el1, el2); 105 | var el2 = dom.createElement("div"); 106 | dom.setAttribute(el2,"class","container-fluid"); 107 | var el3 = dom.createTextNode("\n "); 108 | dom.appendChild(el2, el3); 109 | var el3 = dom.createComment(""); 110 | dom.appendChild(el2, el3); 111 | var el3 = dom.createTextNode("\n\n "); 112 | dom.appendChild(el2, el3); 113 | var el3 = dom.createElement("div"); 114 | dom.setAttribute(el3,"class","over-hr r-mt20 r-mb20"); 115 | var el4 = dom.createTextNode("\n "); 116 | dom.appendChild(el3, el4); 117 | var el4 = dom.createElement("span"); 118 | var el5 = dom.createTextNode("API Access"); 119 | dom.appendChild(el4, el5); 120 | dom.appendChild(el3, el4); 121 | var el4 = dom.createTextNode("\n "); 122 | dom.appendChild(el3, el4); 123 | dom.appendChild(el2, el3); 124 | var el3 = dom.createTextNode("\n "); 125 | dom.appendChild(el2, el3); 126 | var el3 = dom.createElement("div"); 127 | dom.setAttribute(el3,"class","row form-group"); 128 | var el4 = dom.createTextNode("\n "); 129 | dom.appendChild(el3, el4); 130 | var el4 = dom.createElement("div"); 131 | dom.setAttribute(el4,"class","col-md-2 form-label"); 132 | var el5 = dom.createTextNode("\n "); 133 | dom.appendChild(el4, el5); 134 | var el5 = dom.createElement("label"); 135 | dom.setAttribute(el5,"class","form-control-static"); 136 | var el6 = dom.createTextNode("Organization"); 137 | dom.appendChild(el5, el6); 138 | dom.appendChild(el4, el5); 139 | var el5 = dom.createTextNode("\n "); 140 | dom.appendChild(el4, el5); 141 | dom.appendChild(el3, el4); 142 | var el4 = dom.createTextNode("\n "); 143 | dom.appendChild(el3, el4); 144 | var el4 = dom.createElement("div"); 145 | dom.setAttribute(el4,"class","col-md-4"); 146 | var el5 = dom.createTextNode("\n "); 147 | dom.appendChild(el4, el5); 148 | var el5 = dom.createComment(""); 149 | dom.appendChild(el4, el5); 150 | var el5 = dom.createTextNode("\n "); 151 | dom.appendChild(el4, el5); 152 | dom.appendChild(el3, el4); 153 | var el4 = dom.createTextNode("\n "); 154 | dom.appendChild(el3, el4); 155 | var el4 = dom.createElement("div"); 156 | dom.setAttribute(el4,"class","col-md-2 form-label"); 157 | var el5 = dom.createTextNode("\n "); 158 | dom.appendChild(el4, el5); 159 | var el5 = dom.createElement("label"); 160 | dom.setAttribute(el5,"class","form-control-static"); 161 | var el6 = dom.createTextNode("Token"); 162 | dom.appendChild(el5, el6); 163 | dom.appendChild(el4, el5); 164 | var el5 = dom.createTextNode("\n "); 165 | dom.appendChild(el4, el5); 166 | dom.appendChild(el3, el4); 167 | var el4 = dom.createTextNode("\n "); 168 | dom.appendChild(el3, el4); 169 | var el4 = dom.createElement("div"); 170 | dom.setAttribute(el4,"class","col-md-4"); 171 | var el5 = dom.createTextNode("\n "); 172 | dom.appendChild(el4, el5); 173 | var el5 = dom.createComment(""); 174 | dom.appendChild(el4, el5); 175 | var el5 = dom.createTextNode("\n "); 176 | dom.appendChild(el4, el5); 177 | dom.appendChild(el3, el4); 178 | var el4 = dom.createTextNode("\n "); 179 | dom.appendChild(el3, el4); 180 | dom.appendChild(el2, el3); 181 | var el3 = dom.createTextNode("\n\n "); 182 | dom.appendChild(el2, el3); 183 | var el3 = dom.createElement("div"); 184 | dom.setAttribute(el3,"class","over-hr r-mt20 r-mb20"); 185 | var el4 = dom.createTextNode("\n "); 186 | dom.appendChild(el3, el4); 187 | var el4 = dom.createElement("span"); 188 | var el5 = dom.createTextNode("Instance"); 189 | dom.appendChild(el4, el5); 190 | dom.appendChild(el3, el4); 191 | var el4 = dom.createTextNode("\n "); 192 | dom.appendChild(el3, el4); 193 | dom.appendChild(el2, el3); 194 | var el3 = dom.createTextNode("\n "); 195 | dom.appendChild(el2, el3); 196 | var el3 = dom.createElement("div"); 197 | dom.setAttribute(el3,"class","row form-group"); 198 | var el4 = dom.createTextNode("\n "); 199 | dom.appendChild(el3, el4); 200 | var el4 = dom.createElement("div"); 201 | dom.setAttribute(el4,"class","col-md-2 form-label"); 202 | var el5 = dom.createTextNode("\n "); 203 | dom.appendChild(el4, el5); 204 | var el5 = dom.createElement("label"); 205 | dom.setAttribute(el5,"class","form-control-static"); 206 | var el6 = dom.createTextNode("Instance Name"); 207 | dom.appendChild(el5, el6); 208 | dom.appendChild(el4, el5); 209 | var el5 = dom.createTextNode("\n "); 210 | dom.appendChild(el4, el5); 211 | dom.appendChild(el3, el4); 212 | var el4 = dom.createTextNode("\n "); 213 | dom.appendChild(el3, el4); 214 | var el4 = dom.createElement("div"); 215 | dom.setAttribute(el4,"class","col-md-4"); 216 | var el5 = dom.createTextNode("\n "); 217 | dom.appendChild(el4, el5); 218 | var el5 = dom.createComment(""); 219 | dom.appendChild(el4, el5); 220 | var el5 = dom.createTextNode("\n "); 221 | dom.appendChild(el4, el5); 222 | dom.appendChild(el3, el4); 223 | var el4 = dom.createTextNode("\n "); 224 | dom.appendChild(el3, el4); 225 | var el4 = dom.createElement("div"); 226 | dom.setAttribute(el4,"class","col-md-2 form-label"); 227 | var el5 = dom.createTextNode("\n "); 228 | dom.appendChild(el4, el5); 229 | var el5 = dom.createElement("label"); 230 | dom.setAttribute(el5,"class","form-control-static"); 231 | var el6 = dom.createTextNode("Region"); 232 | dom.appendChild(el5, el6); 233 | dom.appendChild(el4, el5); 234 | var el5 = dom.createTextNode("\n "); 235 | dom.appendChild(el4, el5); 236 | dom.appendChild(el3, el4); 237 | var el4 = dom.createTextNode("\n "); 238 | dom.appendChild(el3, el4); 239 | var el4 = dom.createElement("div"); 240 | dom.setAttribute(el4,"class","col-md-4"); 241 | var el5 = dom.createTextNode("\n "); 242 | dom.appendChild(el4, el5); 243 | var el5 = dom.createComment(""); 244 | dom.appendChild(el4, el5); 245 | var el5 = dom.createTextNode("\n "); 246 | dom.appendChild(el4, el5); 247 | dom.appendChild(el3, el4); 248 | var el4 = dom.createTextNode("\n "); 249 | dom.appendChild(el3, el4); 250 | dom.appendChild(el2, el3); 251 | var el3 = dom.createTextNode("\n "); 252 | dom.appendChild(el2, el3); 253 | var el3 = dom.createElement("div"); 254 | dom.setAttribute(el3,"class","row form-group"); 255 | var el4 = dom.createTextNode("\n "); 256 | dom.appendChild(el3, el4); 257 | var el4 = dom.createElement("div"); 258 | dom.setAttribute(el4,"class","col-md-2 form-label"); 259 | var el5 = dom.createTextNode("\n "); 260 | dom.appendChild(el4, el5); 261 | var el5 = dom.createElement("label"); 262 | dom.setAttribute(el5,"class","form-control-static"); 263 | var el6 = dom.createTextNode("Image"); 264 | dom.appendChild(el5, el6); 265 | dom.appendChild(el4, el5); 266 | var el5 = dom.createTextNode("\n "); 267 | dom.appendChild(el4, el5); 268 | dom.appendChild(el3, el4); 269 | var el4 = dom.createTextNode("\n "); 270 | dom.appendChild(el3, el4); 271 | var el4 = dom.createElement("div"); 272 | dom.setAttribute(el4,"class","col-md-4"); 273 | var el5 = dom.createTextNode("\n "); 274 | dom.appendChild(el4, el5); 275 | var el5 = dom.createComment(""); 276 | dom.appendChild(el4, el5); 277 | var el5 = dom.createTextNode("\n "); 278 | dom.appendChild(el4, el5); 279 | dom.appendChild(el3, el4); 280 | var el4 = dom.createTextNode("\n "); 281 | dom.appendChild(el3, el4); 282 | var el4 = dom.createElement("div"); 283 | dom.setAttribute(el4,"class","col-md-2 form-label"); 284 | var el5 = dom.createTextNode("\n "); 285 | dom.appendChild(el4, el5); 286 | var el5 = dom.createElement("label"); 287 | dom.setAttribute(el5,"class","form-control-static"); 288 | var el6 = dom.createTextNode("Type"); 289 | dom.appendChild(el5, el6); 290 | dom.appendChild(el4, el5); 291 | var el5 = dom.createTextNode("\n "); 292 | dom.appendChild(el4, el5); 293 | dom.appendChild(el3, el4); 294 | var el4 = dom.createTextNode("\n "); 295 | dom.appendChild(el3, el4); 296 | var el4 = dom.createElement("div"); 297 | dom.setAttribute(el4,"class","col-md-4"); 298 | var el5 = dom.createTextNode("\n "); 299 | dom.appendChild(el4, el5); 300 | var el5 = dom.createComment(""); 301 | dom.appendChild(el4, el5); 302 | var el5 = dom.createTextNode("\n "); 303 | dom.appendChild(el4, el5); 304 | dom.appendChild(el3, el4); 305 | var el4 = dom.createTextNode("\n "); 306 | dom.appendChild(el3, el4); 307 | dom.appendChild(el2, el3); 308 | var el3 = dom.createTextNode("\n "); 309 | dom.appendChild(el2, el3); 310 | var el3 = dom.createElement("div"); 311 | dom.setAttribute(el3,"class","row form-group"); 312 | var el4 = dom.createTextNode("\n "); 313 | dom.appendChild(el3, el4); 314 | var el4 = dom.createElement("div"); 315 | dom.setAttribute(el4,"class","col-md-2 form-label"); 316 | var el5 = dom.createTextNode("\n "); 317 | dom.appendChild(el4, el5); 318 | var el5 = dom.createElement("label"); 319 | dom.setAttribute(el5,"class","form-control-static"); 320 | var el6 = dom.createTextNode("Additional Volumes"); 321 | dom.appendChild(el5, el6); 322 | dom.appendChild(el4, el5); 323 | var el5 = dom.createTextNode("\n "); 324 | dom.appendChild(el4, el5); 325 | dom.appendChild(el3, el4); 326 | var el4 = dom.createTextNode("\n "); 327 | dom.appendChild(el3, el4); 328 | var el4 = dom.createElement("div"); 329 | dom.setAttribute(el4,"class","col-md-4"); 330 | var el5 = dom.createTextNode("\n "); 331 | dom.appendChild(el4, el5); 332 | var el5 = dom.createComment(""); 333 | dom.appendChild(el4, el5); 334 | var el5 = dom.createTextNode("\n "); 335 | dom.appendChild(el4, el5); 336 | dom.appendChild(el3, el4); 337 | var el4 = dom.createTextNode("\n "); 338 | dom.appendChild(el3, el4); 339 | dom.appendChild(el2, el3); 340 | var el3 = dom.createTextNode("\n\n "); 341 | dom.appendChild(el2, el3); 342 | var el3 = dom.createElement("div"); 343 | dom.setAttribute(el3,"class","over-hr r-mt20 r-mb20"); 344 | var el4 = dom.createTextNode("\n "); 345 | dom.appendChild(el3, el4); 346 | var el4 = dom.createElement("span"); 347 | var el5 = dom.createTextNode("Network"); 348 | dom.appendChild(el4, el5); 349 | dom.appendChild(el3, el4); 350 | var el4 = dom.createTextNode("\n "); 351 | dom.appendChild(el3, el4); 352 | dom.appendChild(el2, el3); 353 | var el3 = dom.createTextNode("\n "); 354 | dom.appendChild(el2, el3); 355 | var el3 = dom.createElement("div"); 356 | dom.setAttribute(el3,"class","row form-group"); 357 | var el4 = dom.createTextNode("\n "); 358 | dom.appendChild(el3, el4); 359 | var el4 = dom.createElement("div"); 360 | dom.setAttribute(el4,"class","col-md-2 form-label"); 361 | var el5 = dom.createTextNode("\n "); 362 | dom.appendChild(el4, el5); 363 | var el5 = dom.createElement("label"); 364 | dom.setAttribute(el5,"class","form-control-static"); 365 | var el6 = dom.createTextNode("IP Address"); 366 | dom.appendChild(el5, el6); 367 | dom.appendChild(el4, el5); 368 | var el5 = dom.createTextNode("\n "); 369 | dom.appendChild(el4, el5); 370 | dom.appendChild(el3, el4); 371 | var el4 = dom.createTextNode("\n "); 372 | dom.appendChild(el3, el4); 373 | var el4 = dom.createElement("div"); 374 | dom.setAttribute(el4,"class","col-md-4"); 375 | var el5 = dom.createTextNode("\n "); 376 | dom.appendChild(el4, el5); 377 | var el5 = dom.createComment(""); 378 | dom.appendChild(el4, el5); 379 | var el5 = dom.createTextNode("\n "); 380 | dom.appendChild(el4, el5); 381 | dom.appendChild(el3, el4); 382 | var el4 = dom.createTextNode("\n "); 383 | dom.appendChild(el3, el4); 384 | var el4 = dom.createElement("div"); 385 | dom.setAttribute(el4,"class","col-md-2 form-label"); 386 | var el5 = dom.createTextNode("\n "); 387 | dom.appendChild(el4, el5); 388 | var el5 = dom.createElement("label"); 389 | dom.setAttribute(el5,"class","form-control-static"); 390 | var el6 = dom.createTextNode("IPv6"); 391 | dom.appendChild(el5, el6); 392 | dom.appendChild(el4, el5); 393 | var el5 = dom.createTextNode("\n "); 394 | dom.appendChild(el4, el5); 395 | dom.appendChild(el3, el4); 396 | var el4 = dom.createTextNode("\n "); 397 | dom.appendChild(el3, el4); 398 | var el4 = dom.createElement("div"); 399 | dom.setAttribute(el4,"class","col-md-4"); 400 | var el5 = dom.createTextNode("\n "); 401 | dom.appendChild(el4, el5); 402 | var el5 = dom.createComment(""); 403 | dom.appendChild(el4, el5); 404 | var el5 = dom.createTextNode("\n "); 405 | dom.appendChild(el4, el5); 406 | dom.appendChild(el3, el4); 407 | var el4 = dom.createTextNode("\n "); 408 | dom.appendChild(el3, el4); 409 | dom.appendChild(el2, el3); 410 | var el3 = dom.createTextNode("\n\n "); 411 | dom.appendChild(el2, el3); 412 | var el3 = dom.createElement("div"); 413 | dom.setAttribute(el3,"class","over-hr r-mt20 r-mb20"); 414 | var el4 = dom.createTextNode("\n "); 415 | dom.appendChild(el3, el4); 416 | var el4 = dom.createElement("span"); 417 | var el5 = dom.createTextNode("Debug"); 418 | dom.appendChild(el4, el5); 419 | dom.appendChild(el3, el4); 420 | var el4 = dom.createTextNode("\n "); 421 | dom.appendChild(el3, el4); 422 | dom.appendChild(el2, el3); 423 | var el3 = dom.createTextNode("\n "); 424 | dom.appendChild(el2, el3); 425 | var el3 = dom.createElement("div"); 426 | dom.setAttribute(el3,"class","row form-group"); 427 | var el4 = dom.createTextNode("\n "); 428 | dom.appendChild(el3, el4); 429 | var el4 = dom.createElement("div"); 430 | dom.setAttribute(el4,"class","col-md-2 form-label"); 431 | var el5 = dom.createTextNode("\n "); 432 | dom.appendChild(el4, el5); 433 | var el5 = dom.createElement("label"); 434 | dom.setAttribute(el5,"class","form-control-static"); 435 | var el6 = dom.createTextNode("Enable Debugging"); 436 | dom.appendChild(el5, el6); 437 | dom.appendChild(el4, el5); 438 | var el5 = dom.createTextNode("\n "); 439 | dom.appendChild(el4, el5); 440 | dom.appendChild(el3, el4); 441 | var el4 = dom.createTextNode("\n "); 442 | dom.appendChild(el3, el4); 443 | var el4 = dom.createElement("div"); 444 | dom.setAttribute(el4,"class","col-md-4"); 445 | var el5 = dom.createTextNode("\n "); 446 | dom.appendChild(el4, el5); 447 | var el5 = dom.createComment(""); 448 | dom.appendChild(el4, el5); 449 | var el5 = dom.createTextNode("\n "); 450 | dom.appendChild(el4, el5); 451 | dom.appendChild(el3, el4); 452 | var el4 = dom.createTextNode("\n "); 453 | dom.appendChild(el3, el4); 454 | dom.appendChild(el2, el3); 455 | var el3 = dom.createTextNode("\n\n"); 456 | dom.appendChild(el2, el3); 457 | var el3 = dom.createTextNode(" "); 458 | dom.appendChild(el2, el3); 459 | var el3 = dom.createComment(""); 460 | dom.appendChild(el2, el3); 461 | var el3 = dom.createTextNode("\n "); 462 | dom.appendChild(el2, el3); 463 | dom.appendChild(el1, el2); 464 | var el2 = dom.createTextNode("\n\n"); 465 | dom.appendChild(el1, el2); 466 | var el2 = dom.createTextNode(" "); 467 | dom.appendChild(el1, el2); 468 | var el2 = dom.createComment(""); 469 | dom.appendChild(el1, el2); 470 | var el2 = dom.createTextNode("\n\n"); 471 | dom.appendChild(el1, el2); 472 | var el2 = dom.createTextNode(" "); 473 | dom.appendChild(el1, el2); 474 | var el2 = dom.createComment(""); 475 | dom.appendChild(el1, el2); 476 | var el2 = dom.createTextNode("\n"); 477 | dom.appendChild(el1, el2); 478 | dom.appendChild(el0, el1); 479 | var el1 = dom.createTextNode("\n"); 480 | dom.appendChild(el0, el1); 481 | return el0; 482 | }, 483 | buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) { 484 | var element0 = dom.childAt(fragment, [0]); 485 | var element1 = dom.childAt(element0, [1]); 486 | var element2 = dom.childAt(element1, [5]); 487 | var element3 = dom.childAt(element1, [9]); 488 | var element4 = dom.childAt(element1, [11]); 489 | var element5 = dom.childAt(element1, [17]); 490 | var morphs = new Array(14); 491 | morphs[0] = dom.createMorphAt(element1,1,1); 492 | morphs[1] = dom.createMorphAt(dom.childAt(element2, [3]),1,1); 493 | morphs[2] = dom.createMorphAt(dom.childAt(element2, [7]),1,1); 494 | morphs[3] = dom.createMorphAt(dom.childAt(element3, [3]),1,1); 495 | morphs[4] = dom.createMorphAt(dom.childAt(element3, [7]),1,1); 496 | morphs[5] = dom.createMorphAt(dom.childAt(element4, [3]),1,1); 497 | morphs[6] = dom.createMorphAt(dom.childAt(element4, [7]),1,1); 498 | morphs[7] = dom.createMorphAt(dom.childAt(element1, [13, 3]),1,1); 499 | morphs[8] = dom.createMorphAt(dom.childAt(element5, [3]),1,1); 500 | morphs[9] = dom.createMorphAt(dom.childAt(element5, [7]),1,1); 501 | morphs[10] = dom.createMorphAt(dom.childAt(element1, [21, 3]),1,1); 502 | morphs[11] = dom.createMorphAt(element1,24,24); 503 | morphs[12] = dom.createMorphAt(element0,4,4); 504 | morphs[13] = dom.createMorphAt(element0,7,7); 505 | return morphs; 506 | }, 507 | statements: [ 508 | ["inline","partial",["host/add-common"],[],["loc",[null,[3,4],[3,33]]],0,0], 509 | ["inline","input",[],["type","text","class","form-control","placeholder","Scaleway Organization ID","value",["subexpr","@mut",[["get","model.scalewayConfig.organization",["loc",[null,[16,18],[16,51]]],0,0,0,0]],[],[],0,0]],["loc",[null,[13,10],[17,12]]],0,0], 510 | ["inline","input",[],["type","text","class","form-control","placeholder","Scaleway API Token","value",["subexpr","@mut",[["get","model.scalewayConfig.token",["loc",[null,[26,18],[26,44]]],0,0,0,0]],[],[],0,0]],["loc",[null,[23,10],[27,12]]],0,0], 511 | ["inline","input",[],["type","text","class","form-control","placeholder","Optionally specify the instance name","value",["subexpr","@mut",[["get","model.scalewayConfig.name",["loc",[null,[42,16],[42,41]]],0,0,0,0]],[],[],0,0]],["loc",[null,[39,8],[43,10]]],0,0], 512 | ["inline","input",[],["type","text","class","form-control","placeholder","Specify the location (par1,ams1)","value",["subexpr","@mut",[["get","model.scalewayConfig.region",["loc",[null,[52,16],[52,43]]],0,0,0,0]],[],[],0,0]],["loc",[null,[49,8],[53,10]]],0,0], 513 | ["inline","input",[],["type","text","class","form-control","placeholder","Specify the image","value",["subexpr","@mut",[["get","model.scalewayConfig.image",["loc",[null,[64,18],[64,44]]],0,0,0,0]],[],[],0,0]],["loc",[null,[61,10],[65,12]]],0,0], 514 | ["inline","input",[],["type","text","class","form-control","placeholder","Specify the commercial type","value",["subexpr","@mut",[["get","model.scalewayConfig.commercialType",["loc",[null,[74,18],[74,53]]],0,0,0,0]],[],[],0,0]],["loc",[null,[71,10],[75,12]]],0,0], 515 | ["inline","input",[],["type","text","class","form-control","placeholder","Attach additional volume (e.g., 50G)","value",["subexpr","@mut",[["get","model.scalewayConfig.volumes",["loc",[null,[86,18],[86,46]]],0,0,0,0]],[],[],0,0]],["loc",[null,[83,10],[87,12]]],0,0], 516 | ["inline","input",[],["type","text","class","form-control","placeholder","Optionally specify the IP Address","value",["subexpr","@mut",[["get","model.scalewayConfig.ip",["loc",[null,[102,21],[102,44]]],0,0,0,0]],[],[],0,0]],["loc",[null,[99,13],[103,15]]],0,0], 517 | ["inline","input",[],["type","checkbox","checked",["subexpr","@mut",[["get","model.scalewayConfig.ipv6",["loc",[null,[110,23],[110,48]]],0,0,0,0]],[],[],0,0]],["loc",[null,[109,13],[111,15]]],0,0], 518 | ["inline","input",[],["type","checkbox","checked",["subexpr","@mut",[["get","model.scalewayConfig.debug",["loc",[null,[124,20],[124,46]]],0,0,0,0]],[],[],0,0]],["loc",[null,[123,10],[125,12]]],0,0], 519 | ["inline","partial",["host/add-options"],[],["loc",[null,[130,4],[130,34]]],0,0], 520 | ["inline","top-errors",[],["errors",["subexpr","@mut",[["get","errors",["loc",[null,[134,22],[134,28]]],0,0,0,0]],[],[],0,0]],["loc",[null,[134,2],[134,30]]],0,0], 521 | ["inline","save-cancel",[],["save","save","cancel","cancel"],["loc",[null,[137,2],[137,45]]],0,0] 522 | ], 523 | locals: [], 524 | templates: [] 525 | }; 526 | }()));; 527 | 528 | }); 529 | --------------------------------------------------------------------------------