in managementnode/lib/VCL/Module.pm [132:240]
sub new {
my $class = shift;
my $args = shift;
# Create a variable to store the newly created class object
my $self;
# Make sure a hash reference argument was passed
if (!$args) {
my $data_structure = new VCL::DataStructure();
if ($data_structure) {
$args->{data_structure} = $data_structure;
}
else {
notify($ERRORS{'CRITICAL'}, 0, "no argument was passed and default DataStructure object could not be created");
return;
}
}
elsif (!ref($args) || ref($args) ne 'HASH') {
notify($ERRORS{'CRITICAL'}, 0, "argument passed is not a hash reference");
return;
}
# Make sure the data structure was passed as an argument called 'data_structure'
if (!defined $args->{data_structure}) {
notify($ERRORS{'CRITICAL'}, 0, "required 'data_structure' argument was not passed");
return;
}
# Make sure the 'data_structure' argument contains a VCL::DataStructure object
if (ref $args->{data_structure} ne 'VCL::DataStructure') {
notify($ERRORS{'CRITICAL'}, 0, "'data_structure' argument passed is not a reference to a VCL::DataStructure object");
return;
}
# Add the DataStructure reference to the class object
$self->{data} = $args->{data_structure};
for my $arg_key (keys %$args) {
next if ($arg_key eq 'data_structure');
$self->{$arg_key} = $args->{$arg_key};
#notify($ERRORS{'DEBUG'}, 0, "set '$arg_key' key for $class object from arguments");
}
# Bless the object as the class which new was called with
bless $self, $class;
# Get the memory address of this newly created object - useful for debugging object creation problems
my $address = sprintf('%x', $self);
my $type = ref($self);
# Display a message based on the type of object created
if ($self->isa('VCL::Module::State')) {
my $request_state_name = $self->data->get_request_state_name(0) || '<not set>';
notify($ERRORS{'DEBUG'}, 0, "$type object created for state $request_state_name, address: $address");
}
elsif ($self->isa('VCL::Module::OS') && !$self->isa('VCL::Module::OS::Linux::ManagementNode')) {
my $image_name = $self->data->get_image_name(0) || '<not set>';
notify($ERRORS{'DEBUG'}, 0, "$type object created for image $image_name, address: $address");
}
elsif ($self->isa('VCL::Module::Provisioning')) {
my $computer_name = $self->data->get_computer_short_name(0) || '<not set>';
notify($ERRORS{'DEBUG'}, 0, "$type object created for computer $computer_name, address: $address");
}
else {
notify($ERRORS{'DEBUG'}, 0, "$type object created, address: $address");
}
# Create a management node OS object
# Check to make sure the object currently being created is not a MN OS object to avoid endless loop
if (!$self->isa('VCL::Module::OS::Linux::ManagementNode') && !$self->isa('VCL::Module::State')) {
my $mn_os;
# Check if the mn_os argument was provided
if ($args->{mn_os}) {
$mn_os = $args->{mn_os};
}
elsif ($self->mn_os(0)) {
$mn_os = $self->mn_os();
}
else {
$mn_os = $self->create_mn_os_object();
}
if ($mn_os) {
$self->set_mn_os($mn_os);
$self->data->set_mn_os($mn_os);
}
else {
notify($ERRORS{'WARNING'}, 0, "failed to create management node OS object");
return;
}
}
# Check if not running in setup mode and if initialize() subroutine is defined for this module
if (!$SETUP_MODE || $self->isa('VCL::Module::OS::Linux::ManagementNode')) {
if ($self->can("initialize")) {
# Call the initialize() subroutine, if it returns 0, return 0
# If it doesn't return 0, return the object reference
return if (!$self->initialize($args));
}
}
else {
notify($ERRORS{'DEBUG'}, 0, "initialize not called for $type object ($address) because \$SETUP_MODE is true");
}
return $self;
} ## end sub new