]> git.proxmox.com Git - pve-manager.git/blame - PVE/Ceph/Services.pm
api: install ceph: remove old cruft
[pve-manager.git] / PVE / Ceph / Services.pm
CommitLineData
27439be6
DC
1package PVE::Ceph::Services;
2
3use strict;
4use warnings;
5
6use PVE::Ceph::Tools;
7use PVE::Tools qw(run_command);
8use PVE::RADOS;
9
10use File::Path;
11
12sub ceph_service_cmd {
13 my ($action, $service) = @_;
14
15 my $pve_ceph_cfgpath = PVE::Ceph::Tools::get_config('pve_ceph_cfgpath');
16 if (PVE::Ceph::Tools::systemd_managed()) {
17
18 if ($service && $service =~ m/^(mon|osd|mds|mgr|radosgw)(\.([A-Za-z0-9\-]{1,32}))?$/) {
19 $service = defined($3) ? "ceph-$1\@$3" : "ceph-$1.target";
20 } else {
21 $service = "ceph.target";
22 }
23
24 PVE::Tools::run_command(['/bin/systemctl', $action, $service]);
25
26 } else {
27 # ceph daemons does not call 'setsid', so we do that ourself
28 # (fork_worker send KILL to whole process group)
29 PVE::Tools::run_command(['setsid', 'service', 'ceph', '-c', $pve_ceph_cfgpath, $action, $service]);
30 }
31}
32
33# MDS
34
35sub list_local_mds_ids {
36 my $mds_list = [];
37 my $ceph_mds_data_dir = PVE::Ceph::Tools::get_config('ceph_mds_data_dir');
38 my $ccname = PVE::Ceph::Tools::get_config('ccname');
39
40 PVE::Tools::dir_glob_foreach($ceph_mds_data_dir, qr/$ccname-(\S+)/, sub {
41 my (undef, $mds_id) = @_;
42 push @$mds_list, $mds_id;
43 });
44
45 return $mds_list;
46}
47
48sub get_cluster_mds_state {
49 my ($rados) = @_;
50
51 my $mds_state = {};
52
53 if (!defined($rados)) {
54 $rados = PVE::RADOS->new();
55 }
56
57 my $add_state = sub {
58 my ($mds) = @_;
59
60 my $state = {};
61 $state->{addr} = $mds->{addr};
62 $state->{rank} = $mds->{rank};
63 $state->{standby_replay} = $mds->{standby_replay} ? 1 : 0;
64 $state->{state} = $mds->{state};
65
66 $mds_state->{$mds->{name}} = $state;
67 };
68
69 my $mds_dump = $rados->mon_command({ prefix => 'mds stat' });
70 my $fsmap = $mds_dump->{fsmap};
71
72
73 foreach my $mds (@{$fsmap->{standbys}}) {
74 $add_state->($mds);
75 }
76
77 my $fs_info = $fsmap->{filesystems}->[0];
78 my $active_mds = $fs_info->{mdsmap}->{info};
79
80 # normally there's only one active MDS, but we can have multiple active for
81 # different ranks (e.g., different cephs path hierarchy). So just add all.
82 foreach my $mds (values %$active_mds) {
83 $add_state->($mds);
84 }
85
86 return $mds_state;
87}
88
89sub is_any_mds_active {
90 my ($rados) = @_;
91
92 if (!defined($rados)) {
93 $rados = PVE::RADOS->new();
94 }
95
96 my $mds_dump = $rados->mon_command({ prefix => 'mds stat' });
97 my $fs = $mds_dump->{fsmap}->{filesystems};
98
99 if (!($fs && scalar(@$fs) > 0)) {
100 return undef;
101 }
102 my $active_mds = $fs->[0]->{mdsmap}->{info};
103
104 for my $mds (values %$active_mds) {
105 return 1 if $mds->{state} eq 'up:active';
106 }
107
108 return 0;
109}
110
111sub create_mds {
112 my ($id, $rados) = @_;
113
114 # `ceph fs status` fails with numeric only ID.
115 die "ID: $id, numeric only IDs are not supported\n"
116 if $id =~ /^\d+$/;
117
118 if (!defined($rados)) {
119 $rados = PVE::RADOS->new();
120 }
121
122 my $ccname = PVE::Ceph::Tools::get_config('ccname');
123 my $service_dir = "/var/lib/ceph/mds/$ccname-$id";
124 my $service_keyring = "$service_dir/keyring";
125 my $service_name = "mds.$id";
126
127 die "ceph MDS directory '$service_dir' already exists\n"
128 if -d $service_dir;
129
130 print "creating MDS directory '$service_dir'\n";
131 eval { File::Path::mkpath($service_dir) };
132 my $err = $@;
133 die "creation MDS directory '$service_dir' failed\n" if $err;
134
135 # http://docs.ceph.com/docs/luminous/install/manual-deployment/#adding-mds
136 my $priv = [
137 mon => 'allow profile mds',
138 osd => 'allow rwx',
139 mds => 'allow *',
140 ];
141
142 print "creating keys for '$service_name'\n";
143 my $output = $rados->mon_command({
144 prefix => 'auth get-or-create',
145 entity => $service_name,
146 caps => $priv,
147 format => 'plain',
148 });
149
150 PVE::Tools::file_set_contents($service_keyring, $output);
151
152 print "setting ceph as owner for service directory\n";
153 run_command(["chown", 'ceph:ceph', '-R', $service_dir]);
154
155 print "enabling service 'ceph-mds\@$id.service'\n";
156 ceph_service_cmd('enable', $service_name);
157 print "starting service 'ceph-mds\@$id.service'\n";
158 ceph_service_cmd('start', $service_name);
159
160 return undef;
161};
162
163sub destroy_mds {
164 my ($id, $rados) = @_;
165
166 if (!defined($rados)) {
167 $rados = PVE::RADOS->new();
168 }
169
170 my $ccname = PVE::Ceph::Tools::get_config('ccname');
171
172 my $service_name = "mds.$id";
173 my $service_dir = "/var/lib/ceph/mds/$ccname-$id";
174
175 print "disabling service 'ceph-mds\@$id.service'\n";
176 ceph_service_cmd('disable', $service_name);
177 print "stopping service 'ceph-mds\@$id.service'\n";
178 ceph_service_cmd('stop', $service_name);
179
180 if (-d $service_dir) {
181 print "removing ceph-mds directory '$service_dir'\n";
182 File::Path::remove_tree($service_dir);
183 } else {
184 warn "cannot cleanup MDS $id directory, '$service_dir' not found\n"
185 }
186
187 print "removing ceph auth for '$service_name'\n";
188 $rados->mon_command({
189 prefix => 'auth del',
190 entity => $service_name,
191 format => 'plain'
192 });
193
194 return undef;
195};
196
be7edba1
DC
197# MGR
198
199sub create_mgr {
200 my ($id, $rados) = @_;
201
202 my $clustername = PVE::Ceph::Tools::get_config('ccname');
203 my $mgrdir = "/var/lib/ceph/mgr/$clustername-$id";
204 my $mgrkeyring = "$mgrdir/keyring";
205 my $mgrname = "mgr.$id";
206
207 die "ceph manager directory '$mgrdir' already exists\n"
208 if -d $mgrdir;
209
210 print "creating manager directory '$mgrdir'\n";
211 mkdir $mgrdir;
212 print "creating keys for '$mgrname'\n";
213 my $output = $rados->mon_command({ prefix => 'auth get-or-create',
214 entity => $mgrname,
215 caps => [
216 mon => 'allow profile mgr',
217 osd => 'allow *',
218 mds => 'allow *',
219 ],
220 format => 'plain'});
221 PVE::Tools::file_set_contents($mgrkeyring, $output);
222
223 print "setting owner for directory\n";
224 run_command(["chown", 'ceph:ceph', '-R', $mgrdir]);
225
226 print "enabling service 'ceph-mgr\@$id.service'\n";
227 ceph_service_cmd('enable', $mgrname);
228 print "starting service 'ceph-mgr\@$id.service'\n";
229 ceph_service_cmd('start', $mgrname);
230}
231
232sub destroy_mgr {
233 my ($mgrid) = @_;
234
235 my $clustername = PVE::Ceph::Tools::get_config('ccname');
236 my $mgrname = "mgr.$mgrid";
237 my $mgrdir = "/var/lib/ceph/mgr/$clustername-$mgrid";
238
239 die "ceph manager directory '$mgrdir' not found\n"
240 if ! -d $mgrdir;
241
242 print "disabling service 'ceph-mgr\@$mgrid.service'\n";
243 ceph_service_cmd('disable', $mgrname);
244 print "stopping service 'ceph-mgr\@$mgrid.service'\n";
245 ceph_service_cmd('stop', $mgrname);
246
247 print "removing manager directory '$mgrdir'\n";
248 File::Path::remove_tree($mgrdir);
249}
250
27439be6 2511;