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&ouml;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&auml;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&ouml;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&ouml;tigt."
+    "no-cfg": "Es wird keine Einstellung ben&ouml;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&uuml;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&auml;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