[Pacemaker] [Patch] Optional and message change of the "crm migrate" command.

Dejan Muhamedagic dejanmm at fastmail.fm
Wed Jun 15 12:11:25 EDT 2011


Hi Hideo-san,

On Wed, Jun 15, 2011 at 02:47:09PM +0900, renayama19661014 at ybb.ne.jp wrote:
> Hi all,
> 
> There is the message which does not comply with real operation by the message of the crm command.
> 
> When an operator executes "migrate" command, crm should display "unmigrate" in a message.
> In addition, the crm command does not have the option corresponding to the Q option of the crm_resource command.
> 
> (snip)
> crm(live)resource# move 
> usage: migrate <rsc> [<node>] [<lifetime>] [force]
> crm(live)resource# move grpDummy srv01 P3S force
> Migration will take effect until: 2011-06-15 13:47:39Z
> WARNING: Creating rsc_location constraint 'cli-standby-grpDummy' with a score of -INFINITY for resource grpDummy on srv02.
>         This will prevent grpDummy from running on srv02 until the constraint is removed using the 'crm_resource -U' command or manually with cibadmin
>         This will be the case even if srv02 is the last node in the cluster
>         This message can be disabled with -Q
> (snip)
> 
> I contribute a patch to add message and Q option to.(quiet option)
> 
> 
> (snip)
> crm(live)resource# migrate
> usage: migrate <rsc> [<node>] [<lifetime>] [force] [quiet]
> crm(live)resource# migrate grpDummy srv02 P3S force quiet
> crm(live)resource# unmigrate grpDummy
> crm(live)resource# migrate grpDummy srv01 P3S force
> WARNING: Creating rsc_location constraint 'cli-standby-grpDummy' with a score of -INFINITY for resource grpDummy on srv02.
>         This will prevent grpDummy from running on srv02 until the constraint is removed using the 'crm resource unmigrate' command or manually with cibadmin
>         This will be the case even if srv02 is the last node in the cluster
>         This message can be disabled with quiet
> 
> crm(live)resource# move grpDummy srv02 P3S force 
> WARNING: Creating rsc_location constraint 'cli-standby-grpDummy' with a score of -INFINITY for resource grpDummy on srv02.
>         This will prevent grpDummy from running on srv02 until the constraint is removed using the 'crm resource unmove' command or manually with cibadmin
>         This will be the case even if srv02 is the last node in the cluster
>         This message can be disabled with quiet
> (snip)
> 
> I am going to contribute the patch functionalizing Q option to other crm commands later.
> 
> I do not yet revise crm_cli.txt.
> I intend to send it with the patch of other Q options.

Many thanks for the patch. But we need a common procedure to
fetch and remove options which are used in many commands from
the list of arguments. Options such as "force" and "quiet".
Right now I'm quite busy elsewhere, so that may take time ...

Cheers,

Dejan

> Best Regards,
> Hideo Yamauchi.

> diff -r c3ac0f617f6a ui.py.in
> --- a/ui.py.in	Wed Jun 15 23:35:31 2011 +0900
> +++ b/ui.py.in	Wed Jun 15 23:39:41 2011 +0900
> @@ -759,7 +759,7 @@
>          self.cmd_table["demote"] = (self.demote,(1,1),0,(rsc_list,))
>          self.cmd_table["manage"] = (self.manage,(1,1),0,(rsc_list,))
>          self.cmd_table["unmanage"] = (self.unmanage,(1,1),0,(rsc_list,))
> -        self.cmd_table["migrate"] = (self.migrate,(1,4),0,(rsc_list,nodes_list))
> +        self.cmd_table["migrate"] = (self.migrate,(1,5),0,(rsc_list,nodes_list))
>          self.cmd_table["unmigrate"] = (self.unmigrate,(1,1),0,(rsc_list,))
>          self.cmd_table["param"] = (self.param,(3,4),1,(rsc_list,attr_cmds))
>          self.cmd_table["meta"] = (self.meta,(3,4),1,(rsc_list,attr_cmds))
> @@ -829,32 +829,43 @@
>              return False
>          return set_deep_meta_attr("is-managed","false",rsc)
>      def migrate(self,cmd,*args):
> -        """usage: migrate <rsc> [<node>] [<lifetime>] [force]"""
> +        """usage: migrate <rsc> [<node>] [<lifetime>] [force] [quiet]"""
>          rsc = args[0]
>          if not is_name_sane(rsc):
>              return False
>          node = None
>          lifetime = None
>          force = False
> +        quiet = None
>          if len(args) == 2:
>              if not args[1] in listnodes():
>                  if args[1] == "force":
>                      force = True
> +                elif args[1] == "quiet":
> +                    quiet = args[1]
>                  else:
>                      lifetime = args[1]
>              else:
>                  node = args[1]
> -        elif len(args) == 3:
> +        elif len(args) == 3 or len(args) == 4:
>              if not args[1] in listnodes():
> -                lifetime = args[1]
> -                force = True
> +                for i in range(1, len(args)):
> +                    if args[i] == "force":
> +                        force = True
> +                    elif args[i] == "quiet":
> +                        quiet = args[i]
> +                    else:
> +                        lifetime = args[i]
>              else:
>                  node = args[1]
> -                if args[2] == "force":
> -                    force = True
> -                else:
> -                    lifetime = args[2]
> -        elif len(args) == 4:
> +                for i in range(2, len(args)):
> +                    if args[i] == "force":
> +                    	force = True
> +                    elif args[i] == "quiet":
> +                        quiet = args[i]
> +                    else:
> +                        lifetime = args[i]
> +        elif len(args) == 5:
>              if not is_name_sane(args[1]):
>                  return False
>              node = args[1]
> @@ -863,6 +874,10 @@
>                  syntax_err((cmd,force))
>                  return False
>              force = True
> +            if not args[4] == "quiet":
> +                syntax_err((cmd,quiet))
> +                return False
> +	    quiet = args[4]
>          opts = ''
>          if node:
>              opts = "--node='%s'" % node
> @@ -870,7 +885,18 @@
>              opts = "%s --lifetime='%s'" % (opts,lifetime)
>          if force or user_prefs.get_force():
>              opts = "%s --force" % opts
> -        return ext_cmd(self.rsc_migrate % (rsc,opts)) == 0
> +        if quiet:
> +            opts = "%s -Q" % opts
> +        so, se, rc = get_allout(add_sudo(self.rsc_migrate % (rsc,opts)))
> +        re.search("crm_resource -U", se)
> +        if re:
> +            if cmd == "migrate":
> +                se = re.sub("crm_resource -U", "crm resource unmigrate", se)	
> +            else:
> +                se = re.sub("crm_resource -U", "crm resource unmove", se)	
> +            se = re.sub("with -Q", "with quiet", se)	
> +            page_string(se)
> +        return rc == 0
>      def unmigrate(self,cmd,rsc):
>          "usage: unmigrate <rsc>"
>          if not is_name_sane(rsc):
> diff -r c3ac0f617f6a utils.py
> --- a/utils.py	Wed Jun 15 23:35:31 2011 +0900
> +++ b/utils.py	Wed Jun 15 23:39:41 2011 +0900
> @@ -176,6 +176,19 @@
>          print ".EXT", cmd
>      return subprocess.call(add_sudo(cmd), shell=True)
>  
> +def get_allout(cmd):
> +    '''
> +    Run a cmd, return stdout, stderr, returncode output.
> +    '''
> +    proc = subprocess.Popen(cmd, shell = True, \
> +        stdout = subprocess.PIPE, stderr = subprocess.PIPE)
> +    stdout_value, stderr_value = proc.communicate()
> +    proc.wait()
> +    rc = proc.returncode
> +    stdout_value = stdout_value.strip()
> +    stderr_value = stderr_value.strip()
> +    return stdout_value, stderr_value, rc
> +
>  def get_stdout(cmd, stderr_on = True):
>      '''
>      Run a cmd, return stdin output.

> _______________________________________________
> Pacemaker mailing list: Pacemaker at oss.clusterlabs.org
> http://oss.clusterlabs.org/mailman/listinfo/pacemaker
> 
> Project Home: http://www.clusterlabs.org
> Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
> Bugs: http://developerbugs.linux-foundation.org/enter_bug.cgi?product=Pacemaker





More information about the Pacemaker mailing list