Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 45 additions & 50 deletions htdocs/web_portal/controllers/downtime/add_downtime.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
/*======================================================*/
require_once __DIR__.'/../../../../lib/Gocdb_Services/Factory.php';
require_once __DIR__.'/../utils.php';
require_once __DIR__.'/../../../web_portal/components/Get_User_Principle.php';
require_once __DIR__ . '/../../../../lib/Gocdb_Services/Factory.php';
require_once __DIR__ . '/../utils.php';
require_once __DIR__ . '/../../../web_portal/components/Get_User_Principle.php';
require_once __DIR__ . '/downtime_utils.php';

/**
* Controller for a new_downtime request.
Expand Down Expand Up @@ -60,64 +61,60 @@ function add() {
/**
* Retrieves the raw new downtime's data from a portal request and submit it
* to the services layer's downtime functions.
*
* @param \User $user current user
* @return null
*/
function submit(\User $user = null) {


//Check if this is a confirmed submit or intial submit
function submit(\User $user = null)
{
$confirmed = $_POST['CONFIRMED'];
if($confirmed == true){
//Downtime is confirmed, submit it
//$downtimeInfo = unserialize($_REQUEST['newValues']); // didn't cater for UTF-8 chars
$downtimeInfo = json_decode($_POST['newValues'], TRUE);

if ($confirmed == true) {
/**
* If confirmed by an user, submit the details of affected services
* and endpoints along with other details for each individual site.
*/
$downtimeInfo = json_decode($_POST['newValues'], true);
$serv = \Factory::getDowntimeService();
$downtimeInfo = unsetVariables($downtimeInfo, 'add');
$params = [];

$params['dt'] = $serv->addDowntime($downtimeInfo, $user);
show_view("downtime/added_downtime.php", $params);
}else{
//Show user confirmation screen with their input
$downtimeInfo = getDtDataFromWeb();

//Need to sort the impacted_ids into impacted services and impacted endpoints
$impactedids = $downtimeInfo['IMPACTED_IDS'];

$services=array();
$endpoints=array();

//For each impacted id sort between endpoints and services using the prepended letter
foreach($impactedids as $id){
if (strpos($id, 's') !== FALSE){
//This is a service id
$services[] = str_replace('s', '', $id); //trim off the identifying char before storing in array
}else{
//This is an endpoint id
$endpoints[] = str_replace('e', '', $id); //trim off the identifying char before storing in array
}
}
foreach ($downtimeInfo['SITE_LEVEL_DETAILS'] as $siteID) {
$downtimeInfo['Impacted_Services'] = $siteID['services'];
$downtimeInfo['Impacted_Endpoints'] = $siteID['endpoints'];

unset($downtimeInfo['IMPACTED_IDS']); //Delete the unsorted Ids from the downtime info
$params['submittedDowntimes'][$siteID['siteName']] =
$serv->addDowntime($downtimeInfo, $user);
}

$downtimeInfo['Impacted_Endpoints'] = $endpoints;
show_view("downtime/added_downtime.php", $params);
} else {
// Show user confirmation screen with their input
$downtimeInfo = getDowntimeFormData();

list(
$siteLevelDetails,
$serviceWithEndpoints
) = endpointToServiceMapping($downtimeInfo['IMPACTED_IDS']);

$serv = \Factory::getServiceService();
// Delete the unsorted IDs from the downtime info
unset($downtimeInfo['IMPACTED_IDS']);

/** For endpoint put into downtime we want the parent service also. If a user has selected
* endpoints but not the parent service here we will add the service to maintain the link beteween
* a downtime having both the service and the endpoint.
*/
foreach($downtimeInfo['Impacted_Endpoints'] as $endpointIds){
$endpoint = $serv->getEndpoint($endpointIds);
$services[] = $endpoint->getService()->getId();
if (!count($siteLevelDetails) > 1) {
$downtimeInfo['SINGLE_TIMEZONE'] = true;
}

//Remove any duplicate service ids and store the array of ids
$services = array_unique($services);
list(
$siteLevelDetails,
$serviceWithEndpoints
) = addParentServiceForEndpoints(
$serviceWithEndpoints,
$siteLevelDetails,
false,
$downtimeInfo['DOWNTIME']
);

//Assign the impacted services and endpoints to their own arrays for us by the addDowntime method
$downtimeInfo['Impacted_Services'] = $services;
$downtimeInfo['SITE_LEVEL_DETAILS'] = $siteLevelDetails;
$downtimeInfo['SERVICE_WITH_ENDPOINTS'] = $serviceWithEndpoints;

show_view("downtime/confirm_add_downtime.php", $downtimeInfo);
}
Expand Down Expand Up @@ -215,5 +212,3 @@ function draw(\User $user = null) {
die();
}
}

?>
169 changes: 169 additions & 0 deletions htdocs/web_portal/controllers/downtime/downtime_utils.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
<?php

/*_____________________________________________________________________________
*=============================================================================
* File: downtime_utils.php
* Author: GOCDB DEV TEAM, STFC.
* Description: Helper functions which can be re-used while adding
* or editing a downtime.
*
* License information
*
* Copyright 2013 STFC
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
/*====================================================== */
require_once __DIR__ . '/../../../../lib/Gocdb_Services/Factory.php';

use DateTime;
use DateTimeZone;

/**
* Sorts the impacted IDs into impacted services and impacted endpoints.
*
* @param array $impactedIDs An array of `impactedIDs` which user has selected.
*
* @return array An array containing
* `$siteLevelDetails` and `serviceWithEndpoints`.
*/
function endpointToServiceMapping($impactedIDs)
{
$siteLevelDetails = [];
$serviceWithEndpoints = [];

/**
* For each impacted ID,
* sort between endpoints and services using the prepended letter.
*/
foreach ($impactedIDs as $id) {
list($siteNumber, $parentService, $idType) = explode(':', $id);

$type = strpos($idType, 's') !== false ? 'services' : 'endpoints';
$id = str_replace(['s', 'e'], '', $idType);

$siteLevelDetails[$siteNumber][$type][] = $id;
$serviceWithEndpoints[$siteNumber][$parentService][$type][] = $id;
}

return [$siteLevelDetails, $serviceWithEndpoints];
}

/**
* If a user has selected endpoints but not the parent service here
* we will add the service to maintain the link between a downtime
* having both the service and the endpoint.
*
* @param array $servWithEndpoints Used for displaying affected service
* with endpoint(s).
* @param array $siteDetails Each site ID will have a `services` that
* stores all affected service ID(s) and an
* `endpoints` that stores all affected
* endpoint ID(s).
* @param bool $hasMultipleTimezones If the user selects multiple sites in
* the web portal along with the option
* "site timezone" it will be true;
* otherwise, it will be false.
* @param mixed $downtimeDetails Downtime information.
*
* @return array An array containing `$siteDetails` and `servWithEndpoints`.
*/
function addParentServiceForEndpoints(
$servWithEndpoints,
$siteDetails,
$hasMultipleTimezones,
$downtimeDetails
) {
foreach ($servWithEndpoints as $siteID => $siteData) {
$siteDetails[$siteID]['services'] = [];

$newSite = \Factory::getSiteService()->getSite($siteID);
$siteDetails[$siteID]['siteName'] = $newSite->getShortName();

if ($hasMultipleTimezones) {
list(
$siteDetails[$siteID]['START_TIMESTAMP'],
$siteDetails[$siteID]['END_TIMESTAMP']
) = setLocalTimeForSites($downtimeDetails, $siteID);
}

foreach (array_keys($siteData) as $serviceID) {
$servWithEndpoints[$siteID][$serviceID]['services'] = [];
$servWithEndpoints[$siteID][$serviceID]['services'][] = $serviceID;
// Ensuring that service IDs are unique for the selected sites.
$siteDetails[$siteID]['services'][] = $serviceID;
}
}

return [$siteDetails, $servWithEndpoints];
}

/**
* Converts UTC start and end timestamps to the local timezone
* of a specific site based on that site's timezone.
*
* @param mixed $downtimeDetails Downtime information.
* @param integer $siteID Site ID
*/
function setLocalTimeForSites($downtimeDetails, $siteID)
{
$site = \Factory::getSiteService()->getSite($siteID);

$siteTimezone = $site->getTimeZoneId();

$startTimeAsString = $downtimeDetails['START_TIMESTAMP'];
$utcEndTime = $downtimeDetails['END_TIMESTAMP'];

$utcStartDateTime = DateTime::createFromFormat(
'd/m/Y H:i',
$startTimeAsString,
new DateTimeZone('UTC')
);
$utcEndDateTime = DateTime::createFromFormat(
'd/m/Y H:i',
$utcEndTime,
new DateTimeZone('UTC')
);

$targetSiteTimezone = new DateTimeZone($siteTimezone);
$utcOffset = $targetSiteTimezone->getOffset($utcStartDateTime);

// Calculate the equivalent time in the target timezone.
// Ref: https://www.php.net/manual/en/datetime.modify.php
$siteStartDateTime = $utcStartDateTime->modify("-$utcOffset seconds");
$siteEndDateTime = $utcEndDateTime->modify("-$utcOffset seconds");

return [
$siteStartDateTime->format('d/m/Y H:i'),
$siteEndDateTime->format('d/m/Y H:i')
];
}

/**
* Unset a given variable, helper method to destroy the specified variables.
*
* @param mixed $downtimeObj Object to destroy specified variables.
* @param string $fromLocation Location from where
* the function is being called.
*/
function unsetVariables($downtimeObj, $fromLocation)
{
if ($fromLocation == "add") {
unset($downtimeObj['SERVICE_WITH_ENDPOINTS']);
unset($downtimeObj['SINGLE_TIMEZONE']);
} else {
unset($downtimeObj['DOWNTIME']['EXISTINGID']);
unset($downtimeObj['isEdit']);
unset($downtimeObj['SERVICE_WITH_ENDPOINTS']);
unset($downtimeObj['SINGLE_TIMEZONE']);
}

return $downtimeObj;
}
Loading