enhance discovery folders management

This commit is contained in:
garnier-quentin 2020-02-05 11:46:39 +01:00
parent 12e545e235
commit 57a1c6c577

View File

@ -59,12 +59,15 @@ sub get_folders {
$parent .= '/' . $folder->name; $parent .= '/' . $folder->name;
$self->{paths}->{$value} = $parent; $self->{paths}->{$value} = $parent;
my $children = $folder->childEntity || return; my $children = $folder->childEntity || return;
for my $child (@{$children}) { for my $child (@{$children}) {
next if $child->type ne 'Folder'; next if ($child->type ne 'Folder');
$self->get_folders(folder => centreon::vmware::common::get_view($self->{connector}, $child), parent => $parent, $self->get_folders(
value => $child->value); folder => centreon::vmware::common::get_view($self->{connector}, $child),
parent => $parent,
value => $child->value
);
} }
} }
@ -79,96 +82,106 @@ sub run {
my $filters = $self->build_filter(label => 'name', search_option => 'datacenter', is_regexp => 'filter'); my $filters = $self->build_filter(label => 'name', search_option => 'datacenter', is_regexp => 'filter');
my @properties = ('name', 'hostFolder', 'vmFolder'); my @properties = ('name', 'hostFolder', 'vmFolder');
my $datacenters = centreon::vmware::common::search_entities(command => $self, view_type => 'Datacenter', my $datacenters = centreon::vmware::common::search_entities(
properties => \@properties, filter => $filters); command => $self,
view_type => 'Datacenter',
properties => \@properties,
filter => $filters
);
return if (!defined($datacenters)); return if (!defined($datacenters));
foreach my $datacenter (@{$datacenters}) { foreach my $datacenter (@{$datacenters}) {
my @properties = ('childType', 'childEntity'); my @properties = ('name', 'host');
$self->get_folders(folder => centreon::vmware::common::get_view($self->{connector}, $datacenter->vmFolder), $self->get_folders(
parent => '', value => $datacenter->vmFolder->value); folder => centreon::vmware::common::get_view($self->{connector}, $datacenter->vmFolder),
parent => '',
value => $datacenter->vmFolder->value
);
my @array; my ($status, childs);
if (defined $datacenter->hostFolder) { my $clusters = [];
push @array, $datacenter->hostFolder; ($status, $childs) = centreon::vmware::common::find_entity_views(
} connector => $self->{connector},
view_type => 'ClusterComputeResource',
properties => \@properties,
filter => $filters,
begin_entity => $datacenter,
output_message => 0
);
push $clusters, @$childs if (defined($childs));
($status, $childs) = centreon::vmware::common::find_entity_views(
connector => $self->{connector},
view_type => 'ComputeResource',
properties => \@properties,
filter => $filters,
begin_entity => $datacenter,
output_message => 0
);
push $clusters, @$childs if (defined($childs));
my $childs = centreon::vmware::common::get_views($self->{connector}, \@array, \@properties); foreach my $cluster (@$clusters) {
next if (!defined($childs)); next if (!$cluster->{'host'});
foreach my $child (@{$childs}) { my @properties = ('name', 'vm', 'config.virtualNicManagerInfo.netConfig', 'config.product.version',
next if (!$child->childEntity); 'config.product.productLineId', 'hardware.systemInfo.vendor', 'hardware.systemInfo.model',
my %types = map { $_ => 1 } @{$child->childType}; 'hardware.systemInfo.uuid', 'runtime.powerState', 'runtime.inMaintenanceMode', 'runtime.connectionState');
my %entities = map { $_->type => 1 } @{$child->childEntity};
next if (!defined($types{ComputeResource}) || (!defined($entities{ClusterComputeResource}) &&
!defined($entities{ComputeResource})));
my @properties = ('name', 'host');
my $clusters = centreon::vmware::common::get_views($self->{connector}, \@{$child->childEntity}, \@properties); my $esxs = centreon::vmware::common::get_views($self->{connector}, \@{$cluster->host}, \@properties);
next if (!defined($clusters)); next if (!defined($esxs));
foreach my $cluster (@{$clusters}) { foreach my $esx (@$esxs) {
next if (!$cluster->host); my %esx;
my @properties = ('name', 'vm', 'config.virtualNicManagerInfo.netConfig', 'config.product.version', $esx{type} = "esx";
'config.product.productLineId', 'hardware.systemInfo.vendor', 'hardware.systemInfo.model', $esx{name} = $esx->name;
'hardware.systemInfo.uuid', 'runtime.powerState', 'runtime.inMaintenanceMode', 'runtime.connectionState'); $esx{os} = $esx->{'config.product.productLineId'} . ' ' . $esx->{'config.product.version'};
$esx{hardware} = $esx->{'hardware.systemInfo.vendor'} . ' ' . $esx->{'hardware.systemInfo.model'};
$esx{power_state} = $esx->{'runtime.powerState'}->val;
$esx{connection_state} = $esx->{'runtime.connectionState'}->val;
$esx{maintenance} = $esx->{'runtime.inMaintenanceMode'};
$esx{datacenter} = $datacenter->name;
$esx{cluster} = $cluster->name;
my $esxs = centreon::vmware::common::get_views($self->{connector}, \@{$cluster->host}, \@properties); foreach my $nic (@{$esx->{'config.virtualNicManagerInfo.netConfig'}}) {
next if (!defined($esxs)); my %lookup = map { $_->{'key'} => $_->{'spec'}->{'ip'}->{'ipAddress'} } @{$nic->{'candidateVnic'}};
foreach my $vnic (@{$nic->{'selectedVnic'}}) {
foreach my $esx (@{$esxs}) { push @{$esx{'ip_' . $nic->{'nicType'}}}, $lookup{$vnic};
my %esx;
$esx{type} = "esx";
$esx{name} = $esx->name;
$esx{os} = $esx->{'config.product.productLineId'} . ' ' . $esx->{'config.product.version'};
$esx{hardware} = $esx->{'hardware.systemInfo.vendor'} . ' ' . $esx->{'hardware.systemInfo.model'};
$esx{power_state} = $esx->{'runtime.powerState'}->val;
$esx{connection_state} = $esx->{'runtime.connectionState'}->val;
$esx{maintenance} = $esx->{'runtime.inMaintenanceMode'};
$esx{datacenter} = $datacenter->name;
$esx{cluster} = $cluster->name;
foreach my $nic (@{$esx->{'config.virtualNicManagerInfo.netConfig'}}) {
my %lookup = map { $_->{'key'} => $_->{'spec'}->{'ip'}->{'ipAddress'} } @{$nic->{'candidateVnic'}};
foreach my $vnic (@{$nic->{'selectedVnic'}}) {
push @{$esx{'ip_' . $nic->{'nicType'}}}, $lookup{$vnic};
}
} }
}
push @disco_data, \%esx if ($self->{resource_type} eq 'esx'); push @disco_data, \%esx if (defined($self->{resource_type}) && $self->{resource_type} eq 'esx');
next if ($self->{resource_type} ne 'vm'); next if (!defined($self->{resource_type}) || $self->{resource_type} ne 'vm');
next if (!$esx->vm); next if (!$esx->vm);
@properties = ('parent', 'config.name', 'config.annotation', 'config.template', 'config.uuid', 'config.version', @properties = (
'config.guestId', 'guest.guestState', 'guest.hostName', 'guest.ipAddress', 'runtime.powerState'); 'parent', 'config.name', 'config.annotation', 'config.template', 'config.uuid', 'config.version',
'config.guestId', 'guest.guestState', 'guest.hostName', 'guest.ipAddress', 'runtime.powerState'
);
my $vms = centreon::vmware::common::get_views($self->{connector}, \@{$esx->vm}, \@properties); my $vms = centreon::vmware::common::get_views($self->{connector}, \@{$esx->vm}, \@properties);
next if (!defined($vms)); next if (!defined($vms));
foreach my $vm (@{$vms}) { foreach my $vm (@{$vms}) {
next if ($vm->{'config.template'} eq 'true'); next if ($vm->{'config.template'} eq 'true');
my %vm; my %vm;
$vm{type} = "vm"; $vm{type} = 'vm';
$vm{name} = $vm->{'config.name'}; $vm{name} = $vm->{'config.name'};
$vm{uuid} = $vm->{'config.uuid'}; $vm{uuid} = $vm->{'config.uuid'};
$vm{folder} = (defined($vm->parent) && $vm->parent->type eq 'Folder') ? $self->{paths}->{$vm->parent->value} : ''; $vm{folder} = (defined($vm->parent) && $vm->parent->type eq 'Folder') ? $self->{paths}->{$vm->parent->value} : '';
$vm{annotation} = $vm->{'config.annotation'}; $vm{annotation} = $vm->{'config.annotation'};
$vm{os} = $vm->{'config.guestId'}; $vm{os} = $vm->{'config.guestId'};
$vm{hardware} = $vm->{'config.version'}; $vm{hardware} = $vm->{'config.version'};
$vm{guest_name} = $vm->{'guest.hostName'}; $vm{guest_name} = $vm->{'guest.hostName'};
$vm{guest_ip} = $vm->{'guest.ipAddress'}; $vm{guest_ip} = $vm->{'guest.ipAddress'};
$vm{guest_state} = $vm->{'guest.guestState'}; $vm{guest_state} = $vm->{'guest.guestState'};
$vm{power_state} = $vm->{'runtime.powerState'}->val; $vm{power_state} = $vm->{'runtime.powerState'}->val;
$vm{datacenter} = $datacenter->name; $vm{datacenter} = $datacenter->name;
$vm{cluster} = $cluster->name; $vm{cluster} = $cluster->name;
$vm{esx} = $esx->name; $vm{esx} = $esx->name;
push @disco_data, \%vm; push @disco_data, \%vm;
}
} }
} }
} }