Skip to content

Commit

Permalink
Made Sneaky Pete work with RDL as far as prepare call and most user ops.
Browse files Browse the repository at this point in the history
* Ripped out nova::db::api stuff, which mimicked Nova API in Diablo.
* Added nova::guest::HeartBeat class which works with RDLs slimmed down db.
* Added "guest_id" property to FlagValues class.
* Removed guest_ethernet_device and preset_instance_id props from FlagValues.
* Fixed MySqlAppStatus to work with RDL. Mostly changed db names, and made it handle the "NEW" status.
* Added == operator to IsoDateTime (needed it for a HeartBeat unit test...).
* Changed nova::rpc::Receiver to send ack in the new nicer way.
* Log out Sneaky Pete intro flag to program start up to make it easier to see in the logs.
  • Loading branch information
Tim Simpson committed May 25, 2012
1 parent aabe019 commit 59658fe
Show file tree
Hide file tree
Showing 18 changed files with 321 additions and 436 deletions.
15 changes: 7 additions & 8 deletions Jamroot.jam
Expand Up @@ -258,8 +258,8 @@ unit u_nova_guest_utils
: u_nova_guest_GuestException
;

unit u_nova_db_api
: src/nova/db/api.cc
unit u_nova_guest_HeartBeat
: src/nova/guest/HeartBeat.cc
: u_nova_db_mysql
u_nova_guest_utils
;
Expand Down Expand Up @@ -408,7 +408,7 @@ unit u_nova_guest_diagnostics_InterrogatorMessageHandler
;

alias guest_lib
: u_nova_db_api
: u_nova_guest_HeartBeat
u_nova_configfile
u_nova_flags
u_nova_guest_apt_apt
Expand Down Expand Up @@ -491,18 +491,17 @@ unit-test mysql_nova_updater_tests
: <define>BOOST_TEST_DYN_LINK
<testing.launcher>"BOOST_TEST_CATCH_SYSTEM_ERRORS=no valgrind --leak-check=full"
;
explicit api_tests ;


unit-test api_tests
unit-test HeartBeat_tests
: u_nova_flags
u_nova_db_api
u_nova_guest_HeartBeat
test_dependencies
tests/nova/db/api_tests.cc
tests/nova/guest/HeartBeat_tests.cc
: <define>BOOST_TEST_DYN_LINK
<testing.launcher>"BOOST_TEST_CATCH_SYSTEM_ERRORS=no valgrind --leak-check=full"
;
explicit api_tests ;
explicit HeartBeat_tests ;


# Requires that mysql be utterly destroyed and reinstalled on the machine.
Expand Down
4 changes: 2 additions & 2 deletions copy-to-guest.sh
@@ -1,2 +1,2 @@
mkdir /vz/private/$1/agent
sudo cp -rf * /vz/private/$1/agent/
mkdir /var/lib/vz/private/$1/agent
sudo cp -rf * /var/lib/vz/private/$1/agent/
128 changes: 0 additions & 128 deletions src/nova/db/api.cc

This file was deleted.

50 changes: 0 additions & 50 deletions src/nova/db/api.h

This file was deleted.

10 changes: 3 additions & 7 deletions src/nova/flags.cc
Expand Up @@ -121,7 +121,7 @@ void FlagMap::add_from_file(const char * file_path) {
}

FlagMapPtr FlagMap::create_from_args(size_t count, char** argv,
bool ignore_mismatch) {
bool ignore_mismatch) {
FlagMapPtr flags(new FlagMap());
for (size_t i = 0; i < count; i ++) {
flags->add_from_arg(argv[i], ignore_mismatch);
Expand Down Expand Up @@ -269,8 +269,8 @@ const char * FlagValues::db_backend() const {
return map->get("db_backend", "sqlalchemy");
}

const char * FlagValues::guest_ethernet_device() const {
return map->get("guest_ethernet_device", "eth0");
const char * FlagValues::guest_id() const {
return map->get("guest_id");
}

optional<const char *> FlagValues::host() const {
Expand Down Expand Up @@ -336,10 +336,6 @@ unsigned long FlagValues::periodic_interval() const {
return get_flag_value(*map, "periodic_interval", (unsigned long) 60);
}

optional<int> FlagValues::preset_instance_id() const {
return get_flag_value<int>(*map, "preset_instance_id");
}

size_t FlagValues::rabbit_client_memory() const {
return get_flag_value(*map, "rabbit_client_memory", (size_t) 4096);
}
Expand Down
4 changes: 1 addition & 3 deletions src/nova/flags.h
Expand Up @@ -101,7 +101,7 @@ class FlagValues {

const char * db_backend() const;

const char * guest_ethernet_device() const;
const char * guest_id() const;

boost::optional<const char *> host() const;

Expand Down Expand Up @@ -135,8 +135,6 @@ class FlagValues {

unsigned long periodic_interval() const;

boost::optional<int> preset_instance_id() const;

size_t rabbit_client_memory() const;

const char * rabbit_host() const;
Expand Down
50 changes: 50 additions & 0 deletions src/nova/guest/HeartBeat.cc
@@ -0,0 +1,50 @@
#include "nova/guest/HeartBeat.h"
#include <boost/format.hpp>
#include "nova/Log.h"
#include "nova/db/mysql.h"
#include <string.h>
#include "nova/guest/utils.h"

using boost::format;
using namespace nova::db::mysql;
using boost::optional;
using nova::guest::utils::IsoDateTime;
using std::string;

namespace nova { namespace guest {


HeartBeat::HeartBeat(MySqlConnectionWithDefaultDbPtr con, const char * guest_id)
: con(con), guest_id(guest_id) {
}

HeartBeat::~HeartBeat() {
}


bool HeartBeat::exists() {
con->ensure();
string query = str(format("SELECT updated_at FROM agent_heartbeats "
"WHERE instance_id='%s'")
% con->escape_string(guest_id.c_str()));
MySqlResultSetPtr results = con->query(query.c_str());
return results->next();
}

void HeartBeat::update() {
IsoDateTime now;
const char * query = exists()
? "UPDATE agent_heartbeats SET updated_at = ? "
"WHERE agent_heartbeats.instance_id = ?"
: "INSERT INTO agent_heartbeats (id, updated_at, instance_id) "
"VALUES(UUID(), ?, ?);"
;
con->ensure();
MySqlPreparedStatementPtr stmt = con->prepare_statement(query);
stmt->set_string(0, now.c_str());
stmt->set_string(1, guest_id.c_str());
stmt->execute();
}


} } // end nova::guest
32 changes: 32 additions & 0 deletions src/nova/guest/HeartBeat.h
@@ -0,0 +1,32 @@
#ifndef __NOVA_GUEST_HEARTBEAT
#define __NOVA_GUEST_HEARTBEAT

#include "nova/db/mysql.h"
#include <string>


namespace nova { namespace guest {

/** Updates the agent_heartbeats table with the current time. Used to determine
* if Sneaky Pete is still alive. */
class HeartBeat {
public:
HeartBeat(nova::db::mysql::MySqlConnectionWithDefaultDbPtr con,
const char * guest_id);

~HeartBeat();

void update();

private:

nova::db::mysql::MySqlConnectionWithDefaultDbPtr con;

bool exists();

const std::string guest_id;
};

}} // nova::guest

#endif

0 comments on commit 59658fe

Please sign in to comment.