Ryan Lane has submitted this change and it was merged.
Change subject: (bug 44179 & bug 44180) Add maintenance script for instance
reboot/build completions
......................................................................
(bug 44179 & bug 44180) Add maintenance script for instance reboot/build
completions
Still needs to be run manually after each event.
Change-Id: I617eedcecc67ec54d8eb4e41e31fa1d9b3f0f838
---
M OpenStackManager.i18n.php
M OpenStackManager.php
A OpenStackManagerEvent.php
A maintenance/onInstanceActionCompletion.php
M nova/OpenStackNovaHost.php
M openstack.sql
A schema-changes/openstack_add_notification_events_table.sql
M special/SpecialNovaInstance.php
8 files changed, 183 insertions(+), 16 deletions(-)
Approvals:
Ryan Lane: Verified; Looks good to me, approved
diff --git a/OpenStackManager.i18n.php b/OpenStackManager.i18n.php
index 647a3e7..80e13bf 100644
--- a/OpenStackManager.i18n.php
+++ b/OpenStackManager.i18n.php
@@ -395,7 +395,7 @@
'right-loginviashell' => 'Login via shell',
'notification-osm-instance-deleted' => '$1 deleted instance \'$3\' in
project [[$2]]',
- 'notification-osm-instance-build-completed' => '$1 build instance
\'$3\' in project [[$2]]',
+ 'notification-osm-instance-build-completed' => '$1 built instance
\'$3\' in project [[$2]]',
'notification-osm-instance-reboot-completed' => '$1 rebooted instance
\'$3\' in project [[$2]]',
'echo-pref-email-osm-instance-deleted' => 'Deletes an instance from a
project I\'m a admin on.',
'echo-pref-email-osm-instance-build-completed' => 'Builds an instance
on a project I\'m a admin on.',
diff --git a/OpenStackManager.php b/OpenStackManager.php
index b75c954..7c7aa7c 100644
--- a/OpenStackManager.php
+++ b/OpenStackManager.php
@@ -154,6 +154,7 @@
$wgAutoloadClasses['SpecialNova'] = $dir . 'special/SpecialNova.php';
$wgAutoloadClasses['Spyc'] = $dir . 'Spyc.php';
$wgAutoloadClasses['OpenStackManagerNotificationFormatter'] = $dir .
'OpenStackManagerNotificationFormatter.php';
+$wgAutoloadClasses['OpenStackManagerEvent'] = $dir .
'OpenStackManagerEvent.php';
$wgSpecialPages['NovaInstance'] = 'SpecialNovaInstance';
$wgSpecialPageGroups['NovaInstance'] = 'nova';
$wgSpecialPages['NovaKey'] = 'SpecialNovaKey';
@@ -209,16 +210,15 @@
foreach ( OpenStackNovaProject::getProjectByName(
$extra['projectName'] )->getRoles() as $role ) {
if ( $role->getRoleName() == 'projectadmin' ) {
foreach ( $role->getMembers() as $roleMember ) {
- if ( $roleMember != $event->getAgent()
|| $event->getType() != 'osm-instance-deleted' ) { // Instance deletion
notifications don't need to go to the agent, they already know...
- $roleMemberUser =
User::newFromName( $roleMember );
-
$users[$roleMemberUser->getId()] = $roleMemberUser;
- }
+ $roleMemberUser = User::newFromName(
$roleMember );
+ $users[$roleMemberUser->getId()] =
$roleMemberUser;
}
}
}
} elseif ( $event->getType() == 'osm-instance-reboot-completed' ) {
$users[$event->getAgent()->getId()] = $event->getAgent(); //
Only notify the person who did it to say the reboot was completed.
}
+ unset( $users[0] );
return true;
}
@@ -262,6 +262,7 @@
$updater->addExtensionTable( 'openstack_puppet_vars',
"$base/openstack.sql" );
$updater->addExtensionTable( 'openstack_puppet_classes',
"$base/openstack.sql" );
$updater->addExtensionTable( 'openstack_tokens',
"$base/schema-changes/tokens.sql" );
+ $updater->addExtensionTable( 'openstack_notification_event',
"$base/schema-changes/openstack_add_notification_events_table.sql" );
$updater->addExtensionUpdate( array( 'addField',
'openstack_puppet_groups', 'group_project',
"$base/schema-changes/openstack_project_field.sql", true ) );
$updater->addExtensionUpdate( array( 'addField',
'openstack_puppet_groups', 'group_is_global',
"$base/schema-changes/openstack_group_is_global_field.sql", true ) );
$updater->addExtensionUpdate( array( 'dropField',
'openstack_puppet_groups', 'group_position',
"$base/schema-changes/openstack_drop_positions.sql", true ) );
diff --git a/OpenStackManagerEvent.php b/OpenStackManagerEvent.php
new file mode 100644
index 0000000..bb0faa9
--- /dev/null
+++ b/OpenStackManagerEvent.php
@@ -0,0 +1,38 @@
+<?php
+class OpenStackManagerEvent {
+ public static function createDeletionEvent( $instanceName, $project,
$user ) {
+ if ( class_exists( 'EchoEvent' ) ) {
+ EchoEvent::create( array(
+ 'type' => 'osm-instance-deleted',
+ 'title' => Title::newFromText( $project,
NS_NOVA_RESOURCE ),
+ 'agent' => $user,
+ 'extra' => array(
+ 'instanceName' => $instanceName,
+ 'projectName' => $project
+ )
+ ) );
+ }
+ }
+
+ /**
+ * Store the event information in a DB table. We'll get this back out
in the maintenance/onInstanceActionCompletion.php script.
+ * @param $type string
+ * @param $user User
+ * @param $instance OpenStackNovaInstance
+ * @param $project string
+ */
+ public static function storeEventInfo( $type, $user, $instance,
$project ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->insert(
+ 'openstack_notification_event',
+ array(
+ 'event_action' => $type,
+ 'event_actor_id' => $user->getId(),
+ 'event_instance_host' =>
$instance->getHost()->getFullyQualifiedHostName(),
+ 'event_instance_name' =>
$instance->getInstanceName(),
+ 'event_project' => $project
+ ),
+ __METHOD__
+ );
+ }
+}
diff --git a/maintenance/onInstanceActionCompletion.php
b/maintenance/onInstanceActionCompletion.php
new file mode 100644
index 0000000..2a73523
--- /dev/null
+++ b/maintenance/onInstanceActionCompletion.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * This script should be run when an instance build is completed or when an
instance reboot is completed.
+ * It triggers an Echo notification to the relevant users
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Alex Monk <[email protected]>
+ */
+
+$IP = getenv( 'MW_INSTALL_PATH' );
+
+if ( $IP === false ) {
+ $IP = __DIR__ . '/../../..';
+
+}
+require_once( "$IP/maintenance/Maintenance.php" );
+
+/**
+ * Maintenance script that triggers an Echo notification for instance action
completion.
+ *
+ * @ingroup Maintenance
+ */
+class OnInstanceActionComplete extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->addOption( 'action', 'The action which was taken. Either
build or reboot.', true, true );
+ $this->addOption( 'instance', 'The instance hostname, e.g.
i-00000001.pmtpa.wmflabs.', true, true );
+ }
+
+ public function execute() {
+ if ( !class_exists( 'EchoEvent' ) ) {
+ $this->error( "Couldn't find EchoEvent class.\n", true
);
+ } elseif ( !OpenStackNovaHost::validateHostname(
$this->getOption( 'instance' ) ) ) {
+ $this->error( "Instance hostname is invalid.\n", true );
+ }
+
+ $validActions = array(
+ 'reboot',
+ 'build'
+ );
+
+ if ( !in_array( $this->getOption( 'action' ), $validActions ) )
{
+ $this->error( "Unrecognised action.\n", true );
+ }
+
+ $dbw = wfGetDB( DB_MASTER );
+ $result = $dbw->selectRow(
+ 'openstack_notification_event',
+ array(
+ 'event_actor_id',
+ 'event_project',
+ 'event_instance_name'
+ ),
+ array(
+ 'event_action' => $this->getOption( 'action' ),
+ 'event_instance_host' => $this->getOption(
'instance' )
+ ),
+ __METHOD__
+ );
+
+ if ( !$result ) {
+ $this->error( "Lookup of temporary event info
failed.\n", true );
+ }
+
+ EchoEvent::create( array(
+ 'type' => 'osm-instance-' . $this->getOption( 'action'
) . '-completed',
+ 'title' => Title::newFromText( $result->event_project,
NS_NOVA_RESOURCE ),
+ 'agent' => User::newFromId( $result->event_actor_id ),
+ 'extra' => array(
+ 'instanceName' => $result->event_instance_name,
+ 'projectName' => $result->event_project,
+ 'notifyAgent' => true
+ )
+ ) );
+
+ $dbw->delete(
+ 'openstack_notification_event',
+ array(
+ 'event_action' => $this->getOption( 'action' ),
+ 'event_instance_host' => $this->getOption(
'instance' ),
+ 'event_instance_name' =>
$result->event_instance_name,
+ 'event_project' => $result->event_project,
+ 'event_actor_id' => $result->event_actor_id
+ ),
+ __METHOD__
+ );
+ }
+}
+
+$maintClass = "OnInstanceActionComplete";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/nova/OpenStackNovaHost.php b/nova/OpenStackNovaHost.php
index 2dd08b4..f75334a 100644
--- a/nova/OpenStackNovaHost.php
+++ b/nova/OpenStackNovaHost.php
@@ -684,4 +684,13 @@
}
}
+ /**
+ * @param $hostname
+ * @return bool
+ */
+ static function validateHostname( $hostname ) {
+ # Does not handle trailing dots, purposely
+ return (bool)preg_match(
"/^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*$/",
$hostname );
+ }
+
}
diff --git a/openstack.sql b/openstack.sql
index 2fb669b..7789a93 100644
--- a/openstack.sql
+++ b/openstack.sql
@@ -45,3 +45,13 @@
CREATE INDEX /*i*/class_name on /*_*/openstack_puppet_classes (class_name);
CREATE INDEX /*i*/class_group_id on /*_*/openstack_puppet_classes
(class_group_id);
+
+CREATE TABLE /*_*/openstack_notification_event (
+ event_action varchar(10),
+ event_actor_id int(10),
+ event_instance_host varchar(255),
+ event_instance_name varchar(255),
+ event_project varchar(255)
+) /*$wgDBTableOptions*/;
+
+CREATE INDEX /*i*/event_action_instance_host on
/*_*/openstack_notification_event (event_action, event_instance_host);
diff --git a/schema-changes/openstack_add_notification_events_table.sql
b/schema-changes/openstack_add_notification_events_table.sql
new file mode 100644
index 0000000..5dbabd7
--- /dev/null
+++ b/schema-changes/openstack_add_notification_events_table.sql
@@ -0,0 +1,9 @@
+CREATE TABLE /*_*/openstack_notification_event (
+ event_action varchar(10),
+ event_actor_id int(10),
+ event_instance_host varchar(255),
+ event_instance_name varchar(255),
+ event_project varchar(255)
+) /*$wgDBTableOptions*/;
+
+CREATE INDEX /*i*/event_action_instance_host on
/*_*/openstack_notification_event (event_action, event_instance_host);
diff --git a/special/SpecialNovaInstance.php b/special/SpecialNovaInstance.php
index da55bce..f14a386 100644
--- a/special/SpecialNovaInstance.php
+++ b/special/SpecialNovaInstance.php
@@ -612,6 +612,8 @@
$host = OpenStackNovaHost::addHost( $instance, $domain,
$this->getPuppetInfo( $formData ) );
if ( $host ) {
+ $instance->setHost( $host );
+ OpenStackManagerEvent::storeEventInfo( 'build',
$this->getUser(), $instance, $project );
$title = Title::newFromText(
$this->getOutput()->getPageTitle() );
$job = new OpenStackNovaHostJob( $title, array(
'instanceid' => $instance->getInstanceId(), 'instanceosid' =>
$instance->getInstanceOSId(), 'project' => $project, 'region' => $region ) );
$job->insert();
@@ -655,17 +657,7 @@
$instanceid = $instance->getInstanceId();
$success = $this->userNova->terminateInstance( $instanceosid );
if ( $success ) {
- if ( class_exists( 'EchoEvent' ) ) {
- EchoEvent::create( array(
- 'type' => 'osm-instance-deleted',
- 'title' => Title::newFromText(
$instanceproject, NS_NOVA_RESOURCE ),
- 'agent' => $this->getUser(),
- 'extra' => array(
- 'instanceName' => $instancename,
- 'projectName' =>
$instanceproject
- )
- ) );
- }
+ OpenStackManagerEvent::createDeletionEvent(
$instancename, $instanceproject, $this->getUser() );
$instance->deleteArticle();
$success = OpenStackNovaHost::deleteHostByInstanceId(
$instanceid );
if ( $success ) {
@@ -696,6 +688,7 @@
$instanceid = $formData['instanceid'];
$success = $this->userNova->rebootInstance( $instanceid );
if ( $success ) {
+ OpenStackManagerEvent::storeEventInfo( 'reboot',
$this->getUser(), $this->userNova->getInstance( $instanceid ),
$formData['project'] );
$this->getOutput()->addWikiMsg(
'openstackmanager-rebootedinstance', $instanceid );
} else {
$this->getOutput()->addWikiMsg(
'openstackmanager-rebootinstancefailed' );
--
To view, visit https://gerrit.wikimedia.org/r/45277
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I617eedcecc67ec54d8eb4e41e31fa1d9b3f0f838
Gerrit-PatchSet: 15
Gerrit-Project: mediawiki/extensions/OpenStackManager
Gerrit-Branch: master
Gerrit-Owner: Alex Monk <[email protected]>
Gerrit-Reviewer: Alex Monk <[email protected]>
Gerrit-Reviewer: Reedy <[email protected]>
Gerrit-Reviewer: Ryan Lane <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits