On Mon, Aug 14, 2017 at 09:36:11AM +0200, Alwin Antreich wrote:
> From: Dominik Csapak <d.csa...@proxmox.com>
> 
> we now want to add a ceph-mgr daemon to every node where a ceph-mon
> daemon runs, as per ceph documentation recommendation, because in
> luminous the mgr daemons will not be automatically created/started
> with a monitor anymore
> 
> we also give the createmon an optional id parameter, so that one
> can set a custom id, and make the creation/removal of the manager
> optional but the default
> 
> Signed-off-by: Dominik Csapak <d.csa...@proxmox.com>
> (cherry picked from commit f77a087446390840846cd9300ce3dbe7f4bc7fd6)
> Signed-off-by: Alwin Antreich <a.antre...@proxmox.com>
> ---
>  PVE/API2/Ceph.pm | 106 
> +++++++++++++++++++++++++++++++++++++++++++++++--------
>  PVE/CephTools.pm |   2 +-
>  2 files changed, 92 insertions(+), 16 deletions(-)
> 
> diff --git a/PVE/API2/Ceph.pm b/PVE/API2/Ceph.pm
> index a63199bc..c36f31ff 100644
> --- a/PVE/API2/Ceph.pm
> +++ b/PVE/API2/Ceph.pm
> @@ -809,11 +809,63 @@ my $find_node_ip = sub {
>      die "unable to find local address within network '$cidr'\n";
>  };
>  
> +my $create_mgr = sub {
> +    my ($rados, $id) = @_;
> +
> +    my $clustername = PVE::CephTools::get_config('ccname');
> +    my $mgrdir = "/var/lib/ceph/mgr/$clustername-$id";
> +    my $mgrkeyring = "$mgrdir/keyring";
> +    my $mgrname = "mgr.$id";
> +
> +    die "ceph manager directory '$mgrdir' already exists\n"
> +     if -d $mgrdir;
> +
> +    print "creating manager directory '$mgrdir'\n";
> +    mkdir $mgrdir;
> +    print "creating keys for '$mgrname'\n";
> +    my $output = $rados->mon_command({ prefix => 'auth get-or-create',
> +                                    entity => $mgrname,
> +                                    caps => [
> +                                        mon => 'allow profile mgr',
> +                                        osd => 'allow *',
> +                                        mds => 'allow *',
> +                                    ],
> +                                    format => 'plain'});
> +    PVE::Tools::file_set_contents($mgrkeyring, $output);
> +
> +    print "setting owner for directory\n";
> +    run_command(["chown", 'ceph:ceph', '-R', $mgrdir]);
> +
> +    print "enabling service 'ceph-mgr\@$id.service'\n";
> +    PVE::CephTools::ceph_service_cmd('enable', $mgrname);
> +    print "starting service 'ceph-mgr\@$id.service'\n";
> +    PVE::CephTools::ceph_service_cmd('start', $mgrname);
> +};
> +
> +my $destroy_mgr = sub {
> +    my ($mgrid) = @_;
> +
> +    my $clustername = PVE::CephTools::get_config('ccname');
> +    my $mgrname = "mgr.$mgrid";
> +    my $mgrdir = "/var/lib/ceph/mgr/$clustername-$mgrid";
> +
> +    die "ceph manager directory '$mgrdir' not found\n"
> +     if ! -d $mgrdir;
> +
> +    print "disabling service 'ceph-mgr\@$mgrid.service'\n";
> +    PVE::CephTools::ceph_service_cmd('disable', $mgrname);
> +    print "stopping service 'ceph-mgr\@$mgrid.service'\n";
> +    PVE::CephTools::ceph_service_cmd('stop', $mgrname);
> +
> +    print "removing manager directory '$mgrdir'\n";
> +    File::Path::remove_tree($mgrdir);
> +};
> +
>  __PACKAGE__->register_method ({
>      name => 'createmon',
>      path => 'mon',
>      method => 'POST',
> -    description => "Create Ceph Monitor",
> +    description => "Create Ceph Monitor and Manager",
>      proxyto => 'node',
>      protected => 1,
>      permissions => {
> @@ -823,6 +875,18 @@ __PACKAGE__->register_method ({
>       additionalProperties => 0,
>       properties => {
>           node => get_standard_option('pve-node'),
> +         id => {
> +             type => 'string',
> +             optional => 1,
> +             pattern => '[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?',
> +             description => "The ID for the monitor, when omitted the same 
> as the nodename",
> +         },
> +         'exclude-manager' => {
> +             type => 'boolean',
> +             optional => 1,
> +             default => 0,
> +             description => "When set, only a monitor will be created.",
> +         },
>       },
>      },
>      returns => { type => 'string' },
> @@ -856,14 +920,7 @@ __PACKAGE__->register_method ({
>           }
>       }
>  
> -     my $monid;
> -     for (my $i = 0; $i < 7; $i++) {
> -         if (!$cfg->{"mon.$i"}) {
> -             $monid = $i;
> -             last;
> -         }
> -     }
> -     die "unable to find usable monitor id\n" if !defined($monid);
> +     my $monid = $param->{id} // $param->{node};
>  
>       my $monsection = "mon.$monid"; 
>       my $ip;
> @@ -909,14 +966,15 @@ __PACKAGE__->register_method ({
>           -d $mondir && die "monitor filesystem '$mondir' already exist\n";
>   
>           my $monmap = "/tmp/monmap";
> -     
> +
> +         my $rados = PVE::RADOS->new(timeout => 
> PVE::CephTools::get_config('long_rados_timeout'));
> +
>           eval {
>               mkdir $mondir;
>  
>               run_command("chown ceph:ceph $mondir") if $systemd_managed;
>  
>               if ($moncount > 0) {
> -                 my $rados = PVE::RADOS->new(timeout => 
> PVE::CephTools::get_config('long_rados_timeout'));
>                   my $mapdata = $rados->mon_command({ prefix => 'mon getmap', 
> format => 'plain' });
>                   PVE::Tools::file_set_contents($monmap, $mapdata);
>               } else {
> @@ -947,6 +1005,11 @@ __PACKAGE__->register_method ({
>               eval { PVE::Tools::run_command(['/bin/systemctl', 'enable', 
> "ceph-mon\@${monid}.service"]); };
>               warn "Enable ceph-mon\@${monid}.service manually"if $@;
>           }
> +
> +         # create manager
> +         if (!$param->{'exclude-manager'}) {

Patch 3 should probably add a call to check_ceph_mgr_installed() here as
well with the $noerr parameter set, so that the default behavior still
works when not having upgraded yet.

> +             $create_mgr->($rados, $monid);
> +         }
>       };
>  
>       return $rpcenv->fork_worker('cephcreatemon', $monsection, $authuser, 
> $worker);
> @@ -956,7 +1019,7 @@ __PACKAGE__->register_method ({
>      name => 'destroymon',
>      path => 'mon/{monid}',
>      method => 'DELETE',
> -    description => "Destroy Ceph monitor.",
> +    description => "Destroy Ceph Monitor and Manager.",
>      proxyto => 'node',
>      protected => 1,
>      permissions => {

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to