From 6389fdbc90b0d9da475b0a172c7e7b52363d7a57 Mon Sep 17 00:00:00 2001 From: hahn <axel.hahn@iml.unibe.ch> Date: Thu, 29 Jul 2021 19:42:57 +0200 Subject: [PATCH] phase specific plugin settings --- config/lang/de.json | 2 +- config/lang/en.json | 3 + .../deployment/classes/project.class.php | 21 ++++- .../deployment/classes/rollout_base.class.php | 86 ++++++++++++------- .../plugins/rollout/default/lang_de.json | 2 +- .../plugins/rollout/default/lang_en.json | 4 +- .../rollout/default/rollout_default.php | 7 +- .../deployment/plugins/rollout/ssh/info.json | 20 +++-- .../plugins/rollout/ssh/lang_de.json | 15 ++-- .../plugins/rollout/ssh/rollout_ssh.php | 8 +- 10 files changed, 115 insertions(+), 53 deletions(-) diff --git a/config/lang/de.json b/config/lang/de.json index fc46c953..20ce3339 100644 --- a/config/lang/de.json +++ b/config/lang/de.json @@ -244,7 +244,7 @@ "deploy-configfile-hint": "Hier können Variablen in Bash-Syntax hinterlegt werden. Bei einem Build werden diese in [root]/ci-custom-vars geschrieben und lassen sich vom onbuild oder ondeploy Hook lesen.", "deploy-rollout-plugin": "Rollout-Plugin", "deploy-rollout-plugin-hint": "Geben Sie vor, wie die Zielsystem angesteuert werden, um das Paket zu installieren.", - "deploy-rollout-plugin-config": "Konfiguration des gewählten Plugins", + "deploy-rollout-plugin-config": "Konfiguration des Plugins", "deploy-hint": "Deploy der Queue von Phase [%s]", "deploy-impossible": "Deploy der Queue von Phase [%s] ist nicht möglich.", "deploy-settings": "Deployment-Einstellungen", diff --git a/config/lang/en.json b/config/lang/en.json index ce3575c1..9f575f38 100644 --- a/config/lang/en.json +++ b/config/lang/en.json @@ -244,6 +244,9 @@ "deploy": "Deploy", "deploy-configfile": "Configuration", "deploy-configfile-hint": "Here you can place variables in Bash syntax. During the build it will be writen as [root]/ci-custom-vars and is readable in the onbuild oder ondeploy hook.", + "deploy-rollout-plugin": "Rollout plugin", + "deploy-rollout-plugin-hint": "Here you can define how to trigger a remote system to deploy and install the built package.", + "deploy-rollout-plugin-config": "Configuration of the plugin", "deploy-hint": "Deploy queue of phase [%s]", "deploy-impossible": "Deploy queue of phase [%s] is not possible.", "deploy-settings": "Deployment settings", diff --git a/public_html/deployment/classes/project.class.php b/public_html/deployment/classes/project.class.php index 1624350b..ae1b32f1 100644 --- a/public_html/deployment/classes/project.class.php +++ b/public_html/deployment/classes/project.class.php @@ -3322,6 +3322,7 @@ class project extends base { } + // ---------- Rollout plugins $aRollout = array( 'project-select' => array( 'type' => 'radio', @@ -3386,6 +3387,7 @@ class project extends base { } } + // ---------- /Rollout plugins $aForemanHostgroups = false; $iForemanHostgroupDefault = false; @@ -3690,7 +3692,7 @@ class project extends base { 'value' => '' . '<hr>' .'<label class="col-sm-2">'.t('deploy-rollout-plugin-config') .'</label>' - .'<div class="col-sm-10">'. $aRollout['project-config'].'<hr>PREVIEW:'.$aRollout['preview'].'</div>' + .'<div class="col-sm-10">'. $aRollout['project-config'].'</div>' ), // -------------------------------------------------- 'input' . $i++ => array( @@ -3815,7 +3817,7 @@ class project extends base { // 'required' => 'required', 'validate' => 'isastring', 'size' => 100, - 'placeholder' => 'http://' . $sPhase . '.[' . t("project") . '].[...]/', + 'placeholder' => 'https://' . $sPhase . '.[' . t("project") . '].[...]/', ); $aForms["setup"]["form"]['input' . $i++] = array( 'type' => 'radio', @@ -3833,7 +3835,8 @@ class project extends base { 'onclick' => '$(\'#' . $sDivId4TargetHosts . '\').css(\'display\', (this.checked ? \'none\' : \'block\') )', ), 'puppet' => array( - 'label' => t("deploymethod-puppet"), + // 'label' => t("deploymethod-puppet").' - '. $this->oRolloutPlugin->getName(), + 'label' => t("deploy-rollout-plugin"), 'checked' => $sDeploymethod === "puppet", 'onclick' => '$(\'#' . $sDivId4TargetHosts . '\').css(\'display\', (this.checked ? \'block\' : \'none\') )', ), @@ -3847,11 +3850,23 @@ class project extends base { */ ), ); + + $aForms["setup"]["form"]['input' . $i++] = array( 'type' => 'markup', 'value' => '' . '<div id="' . $sDivId4TargetHosts . '" ' . ($sDeploymethod !== "none" ? '' : ' style="display: none;"') . '">' ); + + // rollout plugin: phase specific overrides + $aForms["setup"]["form"]['input' . $i++] = array( + 'type' => 'markup', + 'value' => '' + // . '<hr>' + .'<label class="col-sm-2">'.t('deploy-rollout-plugin-config') .'</label>' + .'<div class="col-sm-10">'.$aRollout[$sPhase].'</div>' + ); + $aForms["setup"]["form"]['input' . $i++] = array( 'type' => 'text', 'name' => 'phases[' . $sPhase . '][hosts]', diff --git a/public_html/deployment/classes/rollout_base.class.php b/public_html/deployment/classes/rollout_base.class.php index b9954de7..c27d702b 100644 --- a/public_html/deployment/classes/rollout_base.class.php +++ b/public_html/deployment/classes/rollout_base.class.php @@ -76,10 +76,7 @@ class rollout_base implements iRolloutplugin{ // set current plugin id - taken from plugin directory name above $oReflection=new ReflectionClass($this); $this->_sPluginId=basename(dirname($oReflection->getFileName())); - - $this->_sNamePrefix4Project='plugins[rollout]['.$this->getId().']'; - $this->_sNamePrefix4Phase='[plugins][rollout]['.$this->getId().']'; - + // ----- init language if (isset($aParams['lang'])){ $this->setLang($aParams['lang']); @@ -107,6 +104,19 @@ class rollout_base implements iRolloutplugin{ // FORM HELPER // --------------------------------------------------------------- + /** + * get a string for a prefix for name attribute in form vars. + * It is important to store the value in the wanted structure. + * + * @param type $sPhase + * @return type + */ + protected function _getNamePrefix($sPhase=false){ + return ($sPhase + ? 'phases['.$sPhase.'][plugins][rollout]['.$this->getId().']' + : 'plugins[rollout]['.$this->getId().']' + ); + } /** * render a form by given form elementes * @param array $aFormdata array of form elements @@ -132,73 +142,71 @@ class rollout_base implements iRolloutplugin{ /** * render form fields for global plugin variables - * @param string $sPrefixName prefix in the name attribute to store the data in the right structure + * @param string $sScope scope of vars ... one of global|project|phase * @param string $sPhase optional: render global vars in a phase; if no phase was set it renders form fields for project based settings * @return string */ - protected function _renderFormGlobalVars($sPrefixName, $sPhase=false){ + protected function _renderForm4Vars($sScope, $sPhase=false){ $sReturn=''; + + // test vars from info.json file $aInfos=$this->getPluginInfos(); - if(!isset($aInfos['vars']['global'])){ - return ''; + if(!isset($aInfos['vars'][$sScope]) || !count($aInfos['vars'][$sScope])){ + return '---<br>'; } - $sKey=($sPhase ? 'phase_'.$sPhase : 'project'); - // helper vars: directly set values in the settings .. without merge of overrides - /* - $aGlobalValues=$this->_aCfgGlobal; - $aPrjValues=$this->_aCfgProject['deploy']['plugins']['rollout'][$this->getId()]; - $aPhaseValues=($sPhase ? $this->_aCfgProject[$sPhase]['plugins']['rollout'][$this->getId()] : false); - */ + $sKey=($sPhase ? 'phase_'.$sPhase : 'project'); + $sPrefixName=$this->_getNamePrefix($sPhase); // set defaults - to be used in placeholder attribute // no phase = project level - take global defaults of ci config // on a phase - fetch merged cofig data of project $aDefaultValues=($sPhase ? $this->getConfig() : $this->_aCfgGlobal); - + $aDefaultSource=($sPhase ? 'project' : 'global'); + // set defaults - to be used in value attribute $aValues=($sPhase ? $this->_aCfgProject['phases'][$sPhase]['plugins']['rollout'][$this->getId()] : $this->_aCfgProject['plugins']['rollout'][$this->getId()] ); - /* - $aDefaultValues=($sPhase ? $this->_aCfgProject['deploy']['plugins']['rollout'][$this->getId()] : $this->_aCfgGlobal); - - // $aValues=$this->getConfig($sPhase); - $aValues=($sPhase ? $this->_aCfgProject['deploy']['plugins']['rollout'][$this->getId()] : $this->_aCfgGlobal); - * - */ $aFormdata=array(); // create form fields - $aFormdata[]=array('type' => 'markup','value' => '<br>'.$this->_t('section-override-global-vars').':'); + // $aFormdata[]=array('type' => 'markup','value' => '<br>'.$this->_t('section-override-'.$sScope.'-vars').':'); + $aFormdata[]=array('type' => 'markup','value' => '<div style="style: clear: left;"></div><h4>'.$this->getId() .' :: '. $sScope.'</h4>'); + $sMiss=''; - foreach ($aInfos['vars']['global'] as $sVarname=>$aVarinfos){ - if (!isset($this->_aCfgGlobal[$sVarname])){ + foreach ($aInfos['vars'][$sScope] as $sVarname=>$aVarinfos){ + if ($sScope==='global' && !isset($this->_aCfgGlobal[$sVarname])){ $sMiss.='- plugin var was not set in global CI config: plugins -> rollout -> '.$this->getId().' -> "'.$sVarname.'".<br>'; } if($aVarinfos['type']=="text"){ $aFormdata[]=array( 'type' => 'text', 'name' => $sPrefixName.'['.$sVarname.']', - 'label' => $this->_t('formlabel-'.$sVarname), + 'label' => $this->_t($sVarname.'-label'), + 'title' => $this->_t($sVarname.'-hint'), 'value' => (isset($aValues[$sVarname]) ? $aValues[$sVarname] : ''), // 'required' => 'required', 'validate' => 'isastring', // 'size' => 25, // 'placeholder' => (isset($this->_aCfgGlobal[$sVarname]) ? $this->_aCfgGlobal[$sVarname] : '') . ' | '.$aDefaultValues[$sVarname], - 'placeholder' => (isset($aDefaultValues[$sVarname]) ? $aDefaultValues[$sVarname] : 'N.A.'), + 'placeholder' => (isset($aDefaultValues[$sVarname]) + ? $aDefaultSource.': '.$aDefaultValues[$sVarname] + : (isset($aVarinfos['default']) ? $aVarinfos['default'] : 'N.A.') + ), ); } else { $sMiss.='- plugin var "'.$sVarname.'" does not have type text. It cannot be rendered so far.<br>'; } } - + // $aFormdata[]=array('type' => 'markup','value' => '<div style="style: clear: left;"></div><br><br>'); return $this->_renderForm($aFormdata, $sKey) . ($sMiss ? '<pre>WARNINGS:<br>'.$sMiss.'</pre>' : '') ; } + /** * get a translated text from lang_XX.json in plugin dir; * If the key is missed it returns "[KEY :: LANG]" @@ -385,9 +393,25 @@ class rollout_base implements iRolloutplugin{ // INTERFACE :: RENDERER // ---------------------------------------------------------------------- public function renderFormdata4Project() { - return ''; + return '' + . $this->_renderForm4Vars('global', false) + . $this->_renderForm4Vars('project', false) + // . $this->_renderFormProjectVars($this->_sNamePrefix4Project, false) + // . '<pre>DEBUG: GLOBAL settings - $this->_aCfgGlobal = ' . print_r($this->_aCfgGlobal, 1) . '</pre>' + // . '<pre>DEBUG: PROJECT settings - $this->getConfig() = ' . print_r($this->getConfig(), 1) . '</pre>' + // .'<pre>DEBUG: $this->_aCfgProject ... plugin = '.print_r($this->_aCfgProject, 1).'</pre>' + ; } public function renderFormdata4Phase($sMyPhase){ - return ''; + return '' + . $this->_renderForm4Vars('global', $sMyPhase) + . $this->_renderForm4Vars('project', $sMyPhase) + . $this->_renderForm4Vars('phase', $sMyPhase) + // . $this->_renderForm($aFormdata, 'project') + // .$sReturn + // . '<pre>DEBUG: GLOBAL settings - $this->_aCfgGlobal = ' . print_r($this->_aCfgGlobal, 1) . '</pre>' + // . '<pre>DEBUG: PROJECT settings - $this->getConfig() = ' . print_r($this->getConfig(), 1) . '</pre>' + // . '<pre>DEBUG: PHASE settings - $this->getConfig("'.$sMyPhase.'") = ' . print_r($this->getConfig($sMyPhase), 1) . '</pre>' + ; } } diff --git a/public_html/deployment/plugins/rollout/default/lang_de.json b/public_html/deployment/plugins/rollout/default/lang_de.json index 540c8bbb..23e15d2f 100644 --- a/public_html/deployment/plugins/rollout/default/lang_de.json +++ b/public_html/deployment/plugins/rollout/default/lang_de.json @@ -2,5 +2,5 @@ "plugin_name": "Default: keine Aktion", "description": "Es wird keine Aktion zum Rollout gestartet.", - "no-project-cfg": "Es wird keine Einstellungen benötigt." + "no-cfg": "Es wird keine Einstellung benötigt." } \ No newline at end of file diff --git a/public_html/deployment/plugins/rollout/default/lang_en.json b/public_html/deployment/plugins/rollout/default/lang_en.json index 9f0c03ef..cfad0986 100644 --- a/public_html/deployment/plugins/rollout/default/lang_en.json +++ b/public_html/deployment/plugins/rollout/default/lang_en.json @@ -1,4 +1,6 @@ { "plugin_name": "Default: no action", - "description": "Doing nothing for rollout of a package." + "description": "Doing nothing for rollout of a package.", + + "no-cfg": "No further settings needed," } \ No newline at end of file diff --git a/public_html/deployment/plugins/rollout/default/rollout_default.php b/public_html/deployment/plugins/rollout/default/rollout_default.php index a1f864ab..b0e1df57 100644 --- a/public_html/deployment/plugins/rollout/default/rollout_default.php +++ b/public_html/deployment/plugins/rollout/default/rollout_default.php @@ -26,7 +26,10 @@ class rollout_default extends rollout_base { } public function renderFormdata4Project() { - return $this->_t('no-project-cfg'); - + return $this->_t('no-cfg'); } + + public function renderFormdata4Phase() { + return $this->_t('no-cfg'); + } } diff --git a/public_html/deployment/plugins/rollout/ssh/info.json b/public_html/deployment/plugins/rollout/ssh/info.json index 0cb75188..e148fb8c 100644 --- a/public_html/deployment/plugins/rollout/ssh/info.json +++ b/public_html/deployment/plugins/rollout/ssh/info.json @@ -11,11 +11,11 @@ "global": { "user": { "type": "text", - "default": "remoteuser" + "default": "example: remoteuser" }, "command": { "type": "text", - "default": "/opt/somewhere/install.sh" + "default": "example: /opt/somewhere/install.sh" }, "privatekey": { "type": "text", @@ -27,11 +27,21 @@ }, "testcommand": { "type": "text", - "default": "sudo echo OK" + "default": "example: sudo echo OK" } }, - "project": {}, - "phase": {} + "project": { + "projectfile": { + "type": "text", + "default": "" + } + }, + "phase": { + "hosts": { + "type": "text", + "default": "example: myserver.example.com" + } + } } } diff --git a/public_html/deployment/plugins/rollout/ssh/lang_de.json b/public_html/deployment/plugins/rollout/ssh/lang_de.json index dc69ecd0..8c73bfed 100644 --- a/public_html/deployment/plugins/rollout/ssh/lang_de.json +++ b/public_html/deployment/plugins/rollout/ssh/lang_de.json @@ -7,11 +7,16 @@ "section-optional": "optionale Angaben", "section-commands": "Kommandos", - "formlabel-user": "SSH User", - "formlabel-command": "Kommando", - "formlabel-privatekey": "Dateiname des Privatekeys", - "formlabel-addkeycommand": "Hinzufügen in die known_hosts", - "formlabel-testcommand": "Test-Remote-Kommando", + "user-label": "SSH User", + "user-hint": "Remote Account zu dem sich auf dem Zielsystem verbunden wird.", + "command-label": "Kommando", + "command-hint": "Auf dem Zielsystem zu startendes Kommando", + "privatekey-label": "Dateiname des Privatekeys", + "privatekey-hint": "Kompletter Pfad zur Datei des Privatekeys, wenn vom Default (z.B. ~/.ssh/id_rsa) abweichend.", + "addkeycommand-label": "known_hosts Kommando", + "addkeycommand-hint": "Kommando zum Einsetzen oder Erneuern eines SSH Hostkeys in der known_hosts.", + "testcommand-label": "Test-Remote-Kommando", + "testcommand-hint": "Auf dem Zielsystem zu startendes Testkommando, ob ein Rollout bereit wäre.", "endoffile": "" } \ No newline at end of file diff --git a/public_html/deployment/plugins/rollout/ssh/rollout_ssh.php b/public_html/deployment/plugins/rollout/ssh/rollout_ssh.php index 0891a6d6..df5fa0c9 100644 --- a/public_html/deployment/plugins/rollout/ssh/rollout_ssh.php +++ b/public_html/deployment/plugins/rollout/ssh/rollout_ssh.php @@ -30,7 +30,7 @@ class rollout_ssh extends rollout_base { * form fields for project settings * @return type */ - public function renderFormdata4Project() { + public function __DISABLED__renderFormdata4Project() { /* $sReturn=''; $i=0; @@ -97,7 +97,7 @@ class rollout_ssh extends rollout_base { */ return 'WIP: project based setup for plugin [' . $this->getId() . ']<br>' - . $this->_renderFormGlobalVars($this->_sNamePrefix4Project, false) + . $this->_renderForm4Vars('global', false) // . $this->_renderForm($aFormdata, 'project') // .$sReturn . '<pre>DEBUG: GLOBAL settings - $this->_aCfgGlobal = ' . print_r($this->_aCfgGlobal, 1) . '</pre>' @@ -110,9 +110,9 @@ class rollout_ssh extends rollout_base { * form fields for project settings * @return type */ - public function renderFormdata4Phase($sMyPhase) { + public function __DISABLED__renderFormdata4Phase($sMyPhase) { return 'WIP: pase based setup for plugin [' . $this->getId() . '] in phase '.$sMyPhase.'<br>' - . $this->_renderFormGlobalVars('phases['.$sMyPhase.']'.$this->_sNamePrefix4Phase, $sMyPhase) + . $this->_renderForm4Vars('global', $sMyPhase) // . $this->_renderForm($aFormdata, 'project') // .$sReturn . '<pre>DEBUG: GLOBAL settings - $this->_aCfgGlobal = ' . print_r($this->_aCfgGlobal, 1) . '</pre>' -- GitLab