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

Reply via email to