diff --git a/php/FileCache.php b/php/FileCache.php index c9d6bf5ff..2341bd906 100755 --- a/php/FileCache.php +++ b/php/FileCache.php @@ -156,11 +156,17 @@ public function read( $key, $ttl = null ) { } } - public function get_data( $key, $ttl = null ) { - $contents = $this->read( $key, $ttl ); + public function get_data($key, $options = array()) { + $defaults = array( + 'decode_array' => false, + 'ttl' => null + ); + $options = array_merge($defaults, $options); - if ( $contents ) { - return json_decode( $contents ); + $contents = $this->read($key, $options['ttl']); + + if ($contents) { + return json_decode($contents, $options['decode_array']); } else { return false; diff --git a/php/Terminus/Helpers/Input.php b/php/Terminus/Helpers/Input.php index c151c6660..8ccfcf92e 100755 --- a/php/Terminus/Helpers/Input.php +++ b/php/Terminus/Helpers/Input.php @@ -3,6 +3,7 @@ use \Terminus\User; use \Terminus\SiteFactory; +use \Terminus\SitesCache; use \Terminus\Products; /** @@ -195,22 +196,19 @@ public static function orgname($args, $key) { * @param [string] $label Prompt for STDOUT * @return [string] Site name */ - public static function site( - $args = array(), - $key = 'site', - $label = 'Choose site' - ) { - // early return if a valid site has been offered + public static function sitename($args = array(), $key = 'site', $label = 'Choose site') { + // return early if sitename is provided in args if(isset($args[$key])) { - if($site = SiteFactory::instance($args[$key])) { - $site_name = $site->getName(); - return $site_name; - } + return $args[$key]; } - $sites = SiteFactory::instance(); + $sitesCache = new SitesCache(); + $sitenames = array_map(function($site_cache) { + return $site_cache['name']; + }, $sitesCache->all()); + $choices = array(); - foreach($sites as $site) { - $choices[$site->information->name] = $site->information->name; + foreach($sitenames as $sitename) { + $choices[$sitename] = $sitename; } $menu = self::menu($choices, $default = null, $label); return $menu; diff --git a/php/Terminus/SitesCache.php b/php/Terminus/SitesCache.php index d2cd41d28..caeba5bde 100644 --- a/php/Terminus/SitesCache.php +++ b/php/Terminus/SitesCache.php @@ -7,82 +7,174 @@ use \Terminus_Command; use Terminus\Session; -use Psy; - +/** + * Persists a mapping between Site names and Site IDs + * This is stored in the filecache in a json schema like so: + * + * { + * "" : { + * id: "", + * name: "", + * framework: "", + * service_level: "" + * memberships: { + * "": { + * id: "" + * type: "", + * },... + * } + * },... + * } + * + */ class SitesCache { protected $cache; protected $cachekey = 'sites'; - /** - * Searches the SitesCache for an ID given a name - * - */ - static function find($name, $options = array()) { - $instance = new SitesCache(); - return $instance->_find($name, $options); - } - public function __construct() { $this->cache = Terminus::get_cache(); } - private function _find($name, $options = array()) { - if (!isset($options['rebuild'])) { - $options['rebuild'] = true; - } + private function find($name, $options = array()) { + $defaults = array('rebuild' => true); + $options = array_merge($defaults, $options); if (isset($this->all()[$name])) { - return $this->all()[$name]; + $site_data = $this->all()[$name]; + return $site_data; } else { if ($options['rebuild']) { $this->rebuild(); - return $this->find($name, array('rebuild' => false)); + $recurse_without_rebuild = $this->find($name, array('rebuild' => false)); + return $recurse_without_rebuild; } else { - return false; + return null; } } } + /** + * Searches the SitesCache for an ID given a name + * + */ + public function findID($name, $options = array()) { + $site_data = $this->find($name, $options); + if ($site_data) { + $site_id = $site_data['id']; + return $site_id; + } else { + return null; + } + } + public function all() { - return (array) $this->cache->get_data($this->cachekey); + $cache_data = $this->cache->get_data($this->cachekey, array('decode_array' => true)); + if ($cache_data) { + return $cache_data; + } else { + return array(); + } } - public function add($list = array()) { - $data = array_merge( - (array) $this->cache->get_data($this->cachekey), - $list - ); - $this->cache->put_data($this->cachekey, $data); + /** + * Adds a record for a site to the cache. Records should either be a single assoc_aray + * or a list of arrays that look like this: + * + * array( + * "id" => "" + * "name" => "" + * "membership" => array( + * 'id' => "" + * 'name' => "" + * 'type' => "" + * ) + * ) + */ + public function add($memberships_data = array()) { + $cache = (array) $this->cache->get_data($this->cachekey, array('decode_array' => true)); + + // if a single site item is passed in, wrap it in an array + if (isset($memberships_data['id'])) { + $memberships_data = array($memberships_data); + } + + foreach ($memberships_data as $membership_data) { + $site_id = $membership_data['id']; + $site_name = $membership_data['name']; + $site_framework = $membership_data['framework']; + $site_service_level = $membership_data['service_level']; + $membership = $membership_data['membership']; + $membership_id = $membership_data['membership']['id']; + + if (!isset($cache[$site_name]) || !isset($cache[$site_name]['memberships'])) { + // if site is not in cache, add a new entry + $cache[$site_name] = array( + 'id' => $site_id, + 'name' => $site_name, + 'framework' => $site_framework, + 'service_level' => $site_service_level, + 'memberships' => array() + ); + } + + // then add the membership + $cache[$site_name]['memberships'][$membership_id] = $membership; + } + + # and save the cache + $this->cache->put_data($this->cachekey, $cache); return $this->all(); } public function rebuild() { + // Clear out the cache + $this->cache->put_data($this->cachekey, array()); + // Add user's own sites $this->add($this->fetch_user_sites()); // Add all sites for each of user's organizations - $org_ids = array_keys($this->fetch_user_organizations()); - foreach ($org_ids as $org_id) { - $this->add($this->fetch_organization_sites($org_id)); + $orgs_data = $this->fetch_user_organizations(); + + foreach ($orgs_data as $org_data) { + $this->add($this->fetch_organization_sites($org_data)); } return $this->all(); } + public function remove($sitename) { + $cache = (array) $this->cache->get_data($this->cachekey, array('decode_array' => true)); + unset($cache[$sitename]); + $this->cache->put_data($this->cachekey, $cache); + } + public function clear() { $this->cache->put_data($this->cachekey, array()); } public function fetch_user_sites() { - $response = Terminus_Command::paged_request('users/' . Session::getValue('user_uuid') . '/memberships/sites'); + $user_id = Session::getValue('user_uuid'); + $response = Terminus_Command::paged_request('users/' . $user_id . '/memberships/sites'); - $data = array(); + $memberships_data = array(); foreach ($response['data'] as $membership) { - $data[$membership->site->name] = $membership->id; + $memberships_data[] = array( + 'id' => $membership->id, + 'name' => $membership->site->name, + 'framework' => $membership->site->framework, + 'service_level' => $membership->site->service_level, + 'membership' => array( + 'id' => $user_id, + 'name' => 'Team', + 'type' => 'team', + ) + ); } - return $data; + return $memberships_data; } public function fetch_user_organizations() { @@ -90,22 +182,40 @@ public function fetch_user_organizations() { $data = array(); foreach ($response['data'] as $membership) { - if ($membership->role != 'unprivileged') { - $data[$membership->id] = $membership->organization->profile->name; + if ($membership->role == 'unprivileged') { + // Users with unprivileged role in organizations can't see organization sites + // but must be added to the team + continue; } + + $data[] = array( + 'id' => $membership->id, + 'name' => $membership->organization->profile->name, + 'type' => 'organization' + ); } return $data; } - public function fetch_organization_sites($organization_id) { - $response = Terminus_Command::paged_request('organizations/' . $organization_id . '/memberships/sites'); + public function fetch_organization_sites($org_data) { + $response = Terminus_Command::paged_request('organizations/' . $org_data['id'] . '/memberships/sites'); - $data = array(); + $memberships_data = array(); foreach ($response['data'] as $membership) { - $data[$membership->site->name] = $membership->id; + $memberships_data[] = array( + 'id' => $membership->site->id, + 'name' => $membership->site->name, + 'framework' => $membership->site->framework, + 'service_level' => $membership->site->service_level, + 'membership' => array( + 'id' => $org_data['id'], + 'name' => $org_data['name'], + 'type' => 'organization', + ) + ); } - return $data; + return $memberships_data; } } diff --git a/php/commands/cli.php b/php/commands/cli.php index 97646299f..4ac16af0e 100755 --- a/php/commands/cli.php +++ b/php/commands/cli.php @@ -11,6 +11,10 @@ * */ class CLI_Command extends Terminus_Command { + public function __construct() { + parent::__construct(); + $this->sitesCache = new SitesCache(); + } private function command_to_array( $command ) { $dump = array( @@ -155,7 +159,7 @@ public function console($args, $assoc_args) { $user = new User; if (isset($assoc_args['site'])) { $sitename = $assoc_args['site']; - $site_id = SitesCache::find($sitename); + $site_id = $this->sitesCache->findID($sitename); $site = new Site($site_id); } diff --git a/php/commands/organizations.php b/php/commands/organizations.php index 44b9a1851..3410c8d13 100755 --- a/php/commands/organizations.php +++ b/php/commands/organizations.php @@ -71,7 +71,7 @@ public function sites($args, $assoc_args) { $org = new Organization($selected_org); if (isset($assoc_args['add'])) { - $add = SiteFactory::instance(Input::site($assoc_args,'add')); + $add = SiteFactory::instance(Input::sitename($assoc_args,'add')); Terminus::confirm("Are you sure you want to add %s to %s ?", $assoc_args, array($add->getName(), $org->name)); $org->addSite($add); Terminus::success("Added site!"); @@ -79,7 +79,7 @@ public function sites($args, $assoc_args) { } if (isset($assoc_args['remove'])) { - $remove = SiteFactory::instance(Input::site($assoc_args,'remove')); + $remove = SiteFactory::instance(Input::sitename($assoc_args,'remove')); Terminus::confirm("Are you sure you want to remove %s to %s ?", $assoc_args, array($remove->getName(), $org->name)); $org->removeSite($remove); Terminus::success("Removed site!"); diff --git a/php/commands/site.php b/php/commands/site.php index f42be4db6..cd4a99d66 100755 --- a/php/commands/site.php +++ b/php/commands/site.php @@ -18,9 +18,12 @@ class Site_Command extends Terminus_Command { + public $sitesCache; public function __construct() { parent::__construct(); + + $this->sitesCache = new SitesCache(); } protected $_headers = false; @@ -40,7 +43,7 @@ public function __construct() { * **/ public function attributes($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $data = $site->attributes(); $this->handleDisplay($data, array(), array('Attribute','Value')); } @@ -63,7 +66,7 @@ public function attributes($args, $assoc_args) { * @subcommand branch-create **/ public function branch_create($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $branch = preg_replace('#[_\s]+#',"",@$assoc_args['branch']); $branch = $site->createBranch($branch); } @@ -85,7 +88,7 @@ public function branch_create($args, $assoc_args) { * @subcommand clear-caches */ public function clear_caches($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $env_id = Input::env($assoc_args, 'env'); $workflow = $site->workflows->create('clear_cache', array('environment' => $env_id)); $workflow->wait(); @@ -114,7 +117,7 @@ public function clear_caches($args, $assoc_args) { */ public function code($args, $assoc_args) { $subcommand = array_shift($args); - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $data = $headers = array(); switch($subcommand) { case 'log': @@ -203,7 +206,7 @@ public function code($args, $assoc_args) { * @subcommand connection-mode */ public function connection_mode($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $action = 'show'; $mode = @$assoc_args['set'] ?: false; if (@$assoc_args['set']) { @@ -262,7 +265,7 @@ public function dashboard($args, $assoc_args) { case "Windows NT": $cmd = "start"; break; } - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $env = Input::optional( 'env', $assoc_args ); $env = $env ? sprintf( "#%s", $env ) : null; $url = sprintf("https://dashboard.pantheon.io/sites/%s%s", $site->getId(), $env); @@ -291,8 +294,8 @@ public function dashboard($args, $assoc_args) { * */ public function info($args, $assoc_args) { - $sitename = Input::site($assoc_args); - $site_id = SitesCache::find($sitename); + $sitename = Input::sitename($assoc_args); + $site_id = $this->sitesCache->findID($sitename); $site = new Site($site_id); $site->fetch(); @@ -328,7 +331,7 @@ public function info($args, $assoc_args) { */ public function organizations($args, $assoc_args) { $action = array_shift($args); - $site = SiteFactory::instance( Input::site($assoc_args) ); + $site = SiteFactory::instance( Input::sitename($assoc_args) ); $data = array(); switch ($action) { case 'add': @@ -399,7 +402,7 @@ public function organizations($args, $assoc_args) { */ public function backup($args, $assoc_args) { $action = array_shift($args); - $site = SiteFactory::instance( Input::site( $assoc_args ) ); + $site = SiteFactory::instance( Input::sitename( $assoc_args ) ); $env = Input::env($assoc_args, 'env'); switch ($action) { case 'get': @@ -566,7 +569,7 @@ public function backup($args, $assoc_args) { * @subcommand init-env */ public function init_env($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $environments = array('dev', 'test', 'live'); $env = $site->environment(Input::env( $assoc_args, @@ -607,7 +610,7 @@ public function init_env($args, $assoc_args) { * @subcommand clone-env */ public function clone_env($args, $assoc_args) { - $site = SiteFactory::instance( Input::site( $assoc_args ) ); + $site = SiteFactory::instance( Input::sitename( $assoc_args ) ); $site_id = $site->getId(); $from_env = Input::env($assoc_args, 'from-env', "Choose environment you want to clone from"); $to_env = Input::env($assoc_args, 'to-env', "Choose environment you want to clone to"); @@ -673,7 +676,7 @@ public function clone_env($args, $assoc_args) { * @subcommand create-env */ public function create_env($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); if (isset($assoc_args['env'])) { $env = $assoc_args['env']; @@ -703,7 +706,7 @@ public function create_env($args, $assoc_args) { * @subcommand merge-to-dev */ public function merge_to_dev($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $site->environmentsCollection->fetch(); $multidev_ids = array_map(function($env) { return $env->id; }, $site->environmentsCollection->multidev()); @@ -730,7 +733,7 @@ public function merge_to_dev($args, $assoc_args) { * @subcommand merge-from-dev */ public function merge_from_dev($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $site->environmentsCollection->fetch(); $multidev_ids = array_map(function($env) { return $env->id; }, $site->environmentsCollection->multidev()); @@ -757,7 +760,7 @@ public function merge_from_dev($args, $assoc_args) { * @subcommand delete-env */ public function delete_env($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $site->environmentsCollection->fetch(); $multidev_envs = array_diff($site->environmentsCollection->ids(), array('dev', 'test', 'live')); $env = Input::env($assoc_args, 'env', "Environment to delete", $multidev_envs); @@ -794,7 +797,7 @@ public function delete_env($args, $assoc_args) { * */ public function deploy($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $env = $site->environment(Input::env( $assoc_args, 'env', @@ -843,7 +846,7 @@ public function deploy($args, $assoc_args) { * */ function environments($args, $assoc_args) { - $site = SiteFactory::instance( Input::site( $assoc_args ) ); + $site = SiteFactory::instance( Input::sitename( $assoc_args ) ); $site->environmentsCollection->fetch(); $environments = $site->environmentsCollection->all(); @@ -887,7 +890,7 @@ private function envExists($site_id, $env) { */ public function hostnames($args, $assoc_args) { $action = array_shift($args); - $site = SiteFactory::instance( Input::site( $assoc_args ) ); + $site = SiteFactory::instance( Input::sitename( $assoc_args ) ); $env = Input::env($assoc_args, 'env'); switch ($action) { case 'list': @@ -945,7 +948,7 @@ public function hostnames($args, $assoc_args) { **/ function lock($args, $assoc_args) { $action = array_shift($args); - $site = SiteFactory::instance( Input::site( $assoc_args ) ); + $site = SiteFactory::instance( Input::sitename( $assoc_args ) ); $env = Input::env($assoc_args, 'env'); switch ($action) { case 'info': @@ -999,7 +1002,7 @@ function lock($args, $assoc_args) { * @subcommand import */ public function import($args, $assoc_args) { - $site = SiteFactory::instance( Input::site( $assoc_args ) ); + $site = SiteFactory::instance( Input::sitename( $assoc_args ) ); $url = Input::string($assoc_args, 'url', "URL of archive to import"); if (!$url) { Terminus::error("Please enter a URL."); @@ -1084,7 +1087,7 @@ public function instrument($args, $assoc_args) { $workflow = $site->addInstrument($instrument_id); } $workflow->wait(); - + \Terminus::line("Successfully updated payment instrument to $instrument_id."); } } @@ -1099,7 +1102,7 @@ public function instrument($args, $assoc_args) { * : Site to deploy from **/ public function jobs($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $jobs = $site->jobs(); $data = array(); foreach ($jobs as $job) { @@ -1137,7 +1140,7 @@ public function mount($args, $assoc_args) { $destination = \Terminus\Utils\destination_is_valid($assoc_args['destination']); - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $env = Input::env($assoc_args, 'env'); // Darwin check ... not sure what this is really ... borrowed from terminus 1 @@ -1171,7 +1174,7 @@ public function mount($args, $assoc_args) { * @subcommand new-relic */ public function new_relic($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $data = $site->newRelic(); if($data) { $this->handleDisplay($data->account,$assoc_args,array('Key','Value')); @@ -1190,7 +1193,7 @@ public function new_relic($args, $assoc_args) { * */ public function notifications($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $notifications = $site->notifications(); $data = array(); foreach ($notifications as $note) { @@ -1220,7 +1223,7 @@ public function notifications($args, $assoc_args) { * @subcommand owner */ public function owner($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $data = $site->owner(); $this->handleOutput($data); } @@ -1246,7 +1249,7 @@ public function owner($args, $assoc_args) { */ public function redis($args, $assoc_args) { $action = array_shift($args); - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $env = @$assoc_args['env']; switch ($action) { case 'clear': @@ -1288,7 +1291,7 @@ public function redis($args, $assoc_args) { * @subcommand service-level */ public function service_level($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $info = $site->info('service_level'); if (isset($assoc_args['set'])) { $set = $assoc_args['set']; @@ -1317,7 +1320,7 @@ public function service_level($args, $assoc_args) { */ public function team($args, $assoc_args) { $action = array_shift($args) ?: 'list'; - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $data = array(); switch($action) { case 'add-member': @@ -1358,7 +1361,7 @@ public function team($args, $assoc_args) { * @subcommand upstream-info */ public function upstream_info($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $upstream = $site->getUpstream(); $this->handleDisplay($upstream,$args); } @@ -1377,7 +1380,7 @@ public function upstream_info($args, $assoc_args) { * @alias upstream-updates **/ public function upstream_updates($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $upstream = $site->getUpstreamUpdates(); // data munging as usual @@ -1436,7 +1439,7 @@ public function upstream_updates($args, $assoc_args) { * terminus site wake --site='testsite' --env=dev */ public function wake($args, $assoc_args) { - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $env = Input::env($assoc_args, 'env'); $data = $site->environment($env)->wake(); if (!$data['success']) { @@ -1467,7 +1470,7 @@ public function wake($args, $assoc_args) { public function wipe($args, $assoc_args) { try { $env = @$assoc_args['env'] ?: 'dev'; - $site = SiteFactory::instance(Input::site($assoc_args)); + $site = SiteFactory::instance(Input::sitename($assoc_args)); $site_id = $site->getId(); $env = Input::env($assoc_args, 'env'); Terminus::line("Wiping %s %s", array($site_id, $env)); diff --git a/php/commands/sites.php b/php/commands/sites.php index a6fa430c3..be3d6adf3 100755 --- a/php/commands/sites.php +++ b/php/commands/sites.php @@ -4,6 +4,7 @@ * */ use Terminus\Utils; +use Terminus\Organization; use Terminus\Products; use Terminus\Session; use Terminus\SitesCache; @@ -17,6 +18,8 @@ use Terminus\Workflow; class Sites_Command extends Terminus_Command { + public $sitesCache; + /** * Show a list of your sites on Pantheon * @package Terminus @@ -25,86 +28,42 @@ class Sites_Command extends Terminus_Command { public function __construct() { parent::__construct(); Auth::loggedIn(); - } - - /** - * List Sites in Cache - * - * ## OPTIONS - * - * [--rebuild] - * @subcommand cache - */ - public function cache($args, $assoc_args) { - $sites_cache = new Terminus\SitesCache(); - - if (isset($assoc_args['rebuild'])) { - $sites_cache->rebuild(); - } - $sites = $sites_cache->all(); - - $data = array(); - foreach ($sites as $name => $id) { - $data[] = array( - 'name' => $name, - 'id' => $id - ); - } - - $this->handleDisplay($data, $args); + $this->sitesCache = new SitesCache(); } /** - * Show sites - * - * ## OPTIONS + * Show all sites user has access to + * Note: because of the size of this call, it is cached + * and also is the basis for loading individual sites by name * * @subcommand list * @alias show */ - public function show($args, $assoc_args) { - $sites = SiteFactory::instance(); + public function index($args, $assoc_args) { + // Always fetch a fresh list of sites + $this->sitesCache->rebuild(); + $cached_sites = $this->sitesCache->all(); - if (count($sites) == 0) { + if (count($cached_sites) == 0) { Terminus::log("You have no sites."); exit(0); } - $data = array(); - foreach ($sites as $site) { - $report = array( - 'name' => $site->getName(), + $rows = array_map(function($cached_site) { + return array( + 'name' => $cached_site['name'], + 'id' => $cached_site['id'], + 'service_level' => $cached_site['service_level'], + 'framework' => $cached_site['framework'], + 'memberships' => array_map(function($membership) { + return $membership['name']; + }, $cached_site['memberships']) ); + }, $cached_sites); - $fields = Input::optional('fields', $assoc_args, 'name,framework,service_level,id'); - $filter = Input::optional('filter', $assoc_args, false); - if ($filter) { - if (!strpos($filter,":")) Terminus::error("Improperly formatted filter"); - $filter = explode(':',$filter); - list($filter_field, $filter_value) = $filter; - if (!preg_match("#".preg_quote($filter_value)."#", $site->info($filter_field))) { - // skip rows not matching our filter - continue; - } - } - if ($fields) { - $fields = explode(',',$fields); - foreach ($fields as $field) { - $report[$field] = $site->info($field); - } - } else { - $info = $site->info(); - foreach ($info as $key=>$value) { - $report[$key] = $value; - } - } - - $data[] = $report; - } - - $this->handleDisplay($data); - return $data; + $this->handleDisplay($rows); + return $rows; } @@ -158,10 +117,35 @@ public function create($args, $assoc_args) { $workflow->wait(); Terminus::success("Pow! You created a new site!"); - // Add Name->ID mapping to SitesCache + // Add Site to SitesCache $site_id = $workflow->attributes->final_task->site_id; + $site = new Site($site_id); + $site->fetch(); + + $cache_membership = array( + 'id' => $site_id, + 'name' => $options['name'], + 'service_level' => $site->attributes->service_level, + 'framework' => $site->attributes->framework, + ); + + if ($org_id) { + $org = new Organization($org_id); + $cache_membership['membership'] = array( + 'id' => $org_id, + 'name' => $org->profile->name, + 'type' => 'organization' + ); + } else { + $user_id = Session::getValue('user_uuid'); + $cache_membership['membership'] = array( + 'id' => $user_id, + 'name' => 'Team', + 'type' => 'team' + ); + } $sites_cache = new Terminus\SitesCache(); - $sites_cache->add(array($options['name'] => $site_id)); + $sites_cache->add($cache_membership); if (isset($assoc_args['import'])) { sleep(10); //To stop erroenous site-DNE errors @@ -217,37 +201,27 @@ public function import($args, $assoc_args) { * Delete a site from pantheon * * ## OPTIONS - * --site= - * : Id of the site you want to delete - * - * [--all] - * : Just kidding ... we won't let you do that. + * [--site=] + * : ID of the site you want to delete * * [--force] * : to skip the confirmations - * */ function delete($args, $assoc_args) { - $site_to_delete = SiteFactory::instance(@$assoc_args['site']); - if (!$site_to_delete) { - foreach( SiteFactory::instance() as $id => $site ) { - $site->id = $id; - $sites[] = $site; - $menu[] = $site->information->name; - } - $index = Terminus::menu( $menu, null, "Select a site to delete" ); - $site_to_delete = $sites[$index]; - } - - if (!isset($assoc_args['force']) AND !Terminus::get_config('yes')) { - // if the force option isn't used we'll ask you some annoying questions - Terminus::confirm( sprintf( "Are you sure you want to delete %s?", $site_to_delete->information->name )); - Terminus::confirm( "Are you really sure?" ); - } - Terminus::line( sprintf( "Deleting %s ...", $site_to_delete->information->name ) ); - $response = \Terminus_Command::request( 'sites', $site_to_delete->id, '', 'DELETE' ); + $sitename = Input::sitename($assoc_args); + $site_id = $this->sitesCache->findID($sitename); + $site_to_delete = new Site($site_id); + + if (!isset($assoc_args['force']) AND !Terminus::get_config('yes')) { + // if the force option isn't used we'll ask you some annoying questions + Terminus::confirm( sprintf( "Are you sure you want to delete %s?", $site_to_delete->information->name )); + Terminus::confirm( "Are you really sure?" ); + } + Terminus::line( sprintf( "Deleting %s ...", $site_to_delete->information->name ) ); + $response = \Terminus_Command::request( 'sites', $site_to_delete->id, '', 'DELETE' ); - Terminus::success("Deleted %s!", $site_to_delete->information->name); + $this->sitesCache->remove($sitename); + Terminus::success("Deleted %s!", $sitename); } /** @@ -307,7 +281,8 @@ public function aliases($args, $assoc_args) { * @subcommand mass-update */ public function mass_update($args, $assoc_args) { - $sites = SiteFactory::instance(); + $sites_cache = $this->sitesCache->all(); + $env = 'dev'; $upstream = Input::optional('upstream', $assoc_args, false); $data = array(); @@ -317,8 +292,8 @@ public function mass_update($args, $assoc_args) { // Start status messages. if($upstream) Terminus::line('Looking for sites using '.$upstream.'.'); - foreach( $sites as $site ) { - + foreach($sites_cache as $site_cache ) { + $site = new Site($site_cache['id']); $updates = $site->getUpstreamUpdates(); if (!isset($updates->behind)) { // No updates, go back to start. diff --git a/tests/fixtures/sites-list-empty b/tests/fixtures/sites-list-empty index cd31488bb..69316cd63 100644 --- a/tests/fixtures/sites-list-empty +++ b/tests/fixtures/sites-list-empty @@ -56,3 +56,59 @@ ETag: 'W/"2-a3a6bf43"' Vary: Accept-Encoding body: '{}' +- + request: + method: GET + url: 'https://onebox/api/users/74d3797f-5ff0-432a-8fb8-388fcdb170e0/memberships/sites?limit=100' + headers: + Host: onebox + Accept: null + User-Agent: 'Terminus/1.0.0 (php_version=5.5.24&script=boot-fs.php)' + Cookie: 'X-Pantheon-Session=74d3797f-5ff0-432a-8fb8-388fcdb170e0:9db0261c-37d8-11e5-b301-bc764e115846:mcPRRo0lEvFoc8e4YkZRJ' + response: + status: + http_version: '1.1' + code: '200' + message: OK + headers: + Server: nginx + Date: 'Fri, 07 Aug 2015 23:36:21 GMT' + Content-Type: 'application/json; charset=utf-8' + Transfer-Encoding: chunked + Connection: keep-alive + X-Pantheon-Trace-Id: 1be67890-3d5d-11e5-b6a3-7fb233bbf6b7 + X-Frame-Options: deny + Access-Control-Allow-Origin: '*' + Access-Control-Allow-Methods: GET + Access-Control-Allow-Headers: 'Origin, Content-Type, Accept' + ETag: 'W/"1hIXjeGMcdd2Hw7UTHrE+A=="' + Vary: Accept-Encoding + body: '[]' +- + request: + method: GET + url: 'https://onebox/api/users/74d3797f-5ff0-432a-8fb8-388fcdb170e0/memberships/organizations?limit=100' + headers: + Host: onebox + Accept: null + User-Agent: 'Terminus/1.0.0 (php_version=5.5.24&script=boot-fs.php)' + Cookie: 'X-Pantheon-Session=74d3797f-5ff0-432a-8fb8-388fcdb170e0:9db0261c-37d8-11e5-b301-bc764e115846:mcPRRo0lEvFoc8e4YkZRJ' + response: + status: + http_version: '1.1' + code: '200' + message: OK + headers: + Server: nginx + Date: 'Fri, 07 Aug 2015 23:36:22 GMT' + Content-Type: 'application/json; charset=utf-8' + Transfer-Encoding: chunked + Connection: keep-alive + X-Pantheon-Trace-Id: 1c7e4bc0-3d5d-11e5-b6a3-7fb233bbf6b7 + X-Frame-Options: deny + Access-Control-Allow-Origin: '*' + Access-Control-Allow-Methods: GET + Access-Control-Allow-Headers: 'Origin, Content-Type, Accept' + ETag: 'W/"dbH2DhMOyU9fFhQZNU8Xgg=="' + Vary: Accept-Encoding + body: '[]'