Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
RegionService
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
4 / 4
12
100.00% covered (success)
100.00%
1 / 1
 getRegions
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAvailablility
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
6
 getRegion
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 cacheRegions
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2
3declare(strict_types=1);
4
5namespace Vultr\VultrPhp\Services\Regions;
6
7use Exception;
8use Vultr\VultrPhp\Services\VultrService;
9use Vultr\VultrPhp\Util\ListOptions;
10use Vultr\VultrPhp\Util\VultrUtil;
11use Vultr\VultrPhp\VultrClientException;
12
13/**
14 * Region service handler, for all regions endpoints.
15 *
16 * @see https://www.vultr.com/api/#tag/region
17 */
18class RegionService extends VultrService
19{
20    private static ?array $cache_region = null;
21
22    /**
23     * List all regions at vultr
24     *
25     * @param $options - ListOptions - Interact via reference.
26     * @throws RegionException
27     * @return Region[]
28     */
29    public function getRegions(?ListOptions &$options = null) : array
30    {
31        return $this->getListObjects('regions', new Region(), $options);
32    }
33
34    /**
35     * Get a list of the available plans in the region.
36     *
37     * @param $id - string - Ex ewr - Id of the region
38     * @param $type - string|null - PlanService Filters - FILTER_ALL, FILTER_VC2, FILTER_VHF, FILTER_VDC, FILTER_VBM
39     * @throws RegionException
40     * @return (VPSPlan|BMPlan)[]
41     */
42    public function getAvailablility(string $id, ?string $type = null) : array
43    {
44        try
45        {
46            $params = [];
47            if ($type !== null)
48            {
49                $params['type'] = $type;
50            }
51            $response = $this->getClientHandler()->get('regions/'.$id.'/availability', $params);
52        }
53        catch (VultrClientException $e)
54        {
55            throw new RegionException('Failed to get available compute in region: '.$e->getMessage(), $e->getHTTPCode(), $e);
56        }
57
58        $plans = [];
59        try
60        {
61            $decode = VultrUtil::decodeJSON((string)$response->getBody(), true);
62
63            foreach ($decode['available_plans'] as $plan_id)
64            {
65                $plan = $this->getVultrClient()->plans->getPlan($plan_id);
66                if ($plan === null) continue; // Not valid plan.
67                $plans[] = $plan;
68            }
69        }
70        catch (Exception $e)
71        {
72            throw new RegionException('Failed to deserialize availability plan objects: '.$e->getMessage(), null, $e);
73        }
74        return $plans;
75    }
76
77    /**
78     * Get a specific region object based on the region id
79     *
80     * @param $id - string - Ex ewr - Region id.
81     * @throws RegionException
82     * @return Region|null
83     */
84    public function getRegion(string $id) : ?Region
85    {
86        $this->cacheRegions();
87        return static::$cache_region[$id] ?? null;
88    }
89
90    /**
91     * Cache all regions from the vultr api.
92     *
93     * @param $override - bool - Depending on whether to requery the regions.
94     * @throws RegionException
95     * @return void
96     */
97    public function cacheRegions(bool $override = false) : void
98    {
99        if (static::$cache_region !== null && !$override) return;
100
101        static::$cache_region = [];
102        $options = new ListOptions(500);
103        foreach ($this->getRegions($options) as $region)
104        {
105            static::$cache_region[$region->getId()] = $region;
106        }
107    }
108}