fog-hadoop 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,24 @@
1
+ require 'fog/core'
2
+ require 'fog/json'
3
+ require 'fog/hadoop/utils/request'
4
+
5
+ module Fog
6
+ module Compute
7
+ autoload :Hadoop, File.expand_path('../hadoop/compute', __FILE__)
8
+ end
9
+
10
+ module Hadoop
11
+ extend Fog::Provider
12
+
13
+
14
+ # Miscs
15
+ ## Startup Script
16
+ #autoload :Script, File.expand_path('../sakuracloud/script', __FILE__)
17
+
18
+ service(:compute, 'Compute')
19
+
20
+ def self.yarn_endpoint
21
+ "/ws/v1/cluster"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ module Fog
2
+ module Compute
3
+ class Hadoop < Fog::Service
4
+ requires :hadoop_compute_api_url
5
+
6
+ recognizes :compute_api_url
7
+
8
+
9
+ request_path 'fog/hadoop/requests/compute'
10
+ request :get_info
11
+ request :get_app_stats
12
+ request :get_app_stats_detail
13
+ request :get_metrics
14
+ request :get_node
15
+ request :list_nodes
16
+
17
+ class Real
18
+ include Fog::Hadoop::Utils::Request
19
+
20
+ def initialize(options = {})
21
+
22
+ @compute_api_url = options[:hadoop_compute_api_url] || 'https://localhost:8088/'
23
+ Fog.credentials[:@compute_api_url] = options[:hadoop_compute_api_url]
24
+ @connection = Fog::Core::Connection.new(@compute_api_url)
25
+ end
26
+ end
27
+
28
+ class Mock
29
+ def initialize(options = {})
30
+ @compute_api_url = options[:hadoop_compute_api_url] || 'https://localhost:8088/'
31
+ end
32
+ end
33
+ end #SakuraCloud
34
+ end #Compute
35
+ end
@@ -0,0 +1,40 @@
1
+ module Fog
2
+ module Compute
3
+ class Hadoop
4
+ class Real
5
+ def get_app_stats
6
+ request(
7
+ :expects => [200, 203],
8
+ :method => 'GET',
9
+ :path => "#{Fog::Hadoop.yarn_endpoint}/appstatistics"
10
+ ).body["appStatInfo"]["statItem"]
11
+ end
12
+ end
13
+ class Mock
14
+ def get_app_stats
15
+ response = Excon::Response.new
16
+ response.status = 200
17
+ response.body =
18
+ [
19
+ {
20
+ "state" => "accepted",
21
+ "type" => "mapreduce",
22
+ "count" => 4
23
+ },
24
+ {
25
+ "state" => "running",
26
+ "type" => "mapreduce",
27
+ "count" => 1
28
+ },
29
+ {
30
+ "state" => "finished",
31
+ "type" => "mapreduce",
32
+ "count" => 7
33
+ }
34
+ ]
35
+ response
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,30 @@
1
+ module Fog
2
+ module Compute
3
+ class Hadoop
4
+ class Real
5
+ def get_app_stats_detail(options = {})
6
+ request(
7
+ :expects => [200, 203],
8
+ :method => 'GET',
9
+ :path => "#{Fog::Hadoop.yarn_endpoint}/appstatistics?#{URI.encode_www_form(options)}"
10
+ ).body["appStatInfo"]["statItem"]
11
+ end
12
+ end
13
+ class Mock
14
+ def get_app_stats_detail(options = {})
15
+ response = Excon::Response.new
16
+ response.status = 200
17
+ response.body =
18
+ [
19
+ {
20
+ "state" => "accepted",
21
+ "type" => "mapreduce",
22
+ "count" => 4
23
+ }
24
+ ]
25
+ response
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ module Fog
2
+ module Compute
3
+ class Hadoop
4
+ class Real
5
+ def get_info
6
+ request(
7
+ :expects => [200, 203],
8
+ :method => 'GET',
9
+ :path => "#{Fog::Hadoop.yarn_endpoint}/info"
10
+ ).body["clusterInfo"]
11
+ end
12
+ end
13
+ class Mock
14
+ def get_info
15
+ response = Excon::Response.new
16
+ response.status = 200
17
+ response.body =
18
+ {
19
+ "id" => 1324053971963,
20
+ "startedOn" => 1324053971963,
21
+ "state" => "STARTED",
22
+ "resourceManagerVersion" => "0.23.1-SNAPSHOT",
23
+ "resourceManagerBuildVersion" => "0.23.1-SNAPSHOT from 1214049 by user1"\
24
+ " source checksum 050cd664439d931c8743a6428fd6a693",
25
+ "resourceManagerVersionBuiltOn" => "Tue Dec 13 22:12:48 CST 2011",
26
+ "hadoopVersion" => "0.23.1-SNAPSHOT",
27
+ "hadoopBuildVersion" => "0.23.1-SNAPSHOT from 1214049 by user1"\
28
+ " source checksum 11458df3bb77342dca5f917198fad328",
29
+ "hadoopVersionBuiltOn" => "Tue Dec 13 22:12:26 CST 2011"
30
+
31
+ }
32
+ response
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,49 @@
1
+ module Fog
2
+ module Compute
3
+ class Hadoop
4
+ class Real
5
+ def get_metrics
6
+ request(
7
+ :expects => 200,
8
+ :method => 'GET',
9
+ :path => "#{Fog::Hadoop.yarn_endpoint}/metrics"
10
+ ).body["clusterMetrics"]
11
+ end
12
+ end
13
+ class Mock
14
+ def get_metrics
15
+ response = Excon::Response.new
16
+ response.status = 200
17
+ response.body =
18
+ {
19
+ "appsSubmitted" => 0,
20
+ "appsCompleted" => 0,
21
+ "appsPending" => 0,
22
+ "appsRunning" => 0,
23
+ "appsFailed" => 0,
24
+ "appsKilled" => 0,
25
+ "reservedMB" => 0,
26
+ "availableMB" => 17408,
27
+ "allocatedMB" => 0,
28
+ "reservedVirtualCores" => 0,
29
+ "availableVirtualCores" => 7,
30
+ "allocatedVirtualCores" => 1,
31
+ "containersAllocated" => 0,
32
+ "containersReserved" => 0,
33
+ "containersPending" => 0,
34
+ "totalMB" => 17408,
35
+ "totalVirtualCores" => 8,
36
+ "totalNodes" => 1,
37
+ "lostNodes" => 0,
38
+ "unhealthyNodes" => 0,
39
+ "decommissionedNodes" => 0,
40
+ "rebootedNodes" => 0,
41
+ "activeNodes" => 1
42
+ }
43
+
44
+ response
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,38 @@
1
+ module Fog
2
+ module Compute
3
+ class Hadoop
4
+ class Real
5
+ def get_node(node_ref)
6
+ request(
7
+ :expects => [200, 203],
8
+ :method => 'GET',
9
+ :path => "#{Fog::Hadoop.yarn_endpoint}/nodes/#{node_ref}"
10
+ ).body["node"]
11
+ end
12
+ end
13
+ class Mock
14
+ def get_node(node_ref)
15
+ response = Excon::Response.new
16
+ response.status = 200
17
+ response.body =
18
+ {
19
+ "rack" => "\/default-rack",
20
+ "state" => "NEW",
21
+ "id" => "h2:1235",
22
+ "nodeHostName" => "h2",
23
+ "nodeHTTPAddress" => "h2:2",
24
+ "healthStatus" => "Healthy",
25
+ "lastHealthUpdate" => 1324056895432,
26
+ "healthReport" => "Healthy",
27
+ "numContainers" => 0,
28
+ "usedMemoryMB" => 0,
29
+ "availMemoryMB" => 5120,
30
+ "usedVirtualCores" => 0,
31
+ "availableVirtualCores" => 8
32
+ }
33
+ response
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,55 @@
1
+ module Fog
2
+ module Compute
3
+ class Hadoop
4
+ class Real
5
+ def list_nodes
6
+ request(
7
+ :expects => 200,
8
+ :method => 'GET',
9
+ :path => "#{Fog::Hadoop.yarn_endpoint}/nodes"
10
+ ).body["nodes"]["node"]
11
+ end
12
+ end
13
+ class Mock
14
+ def list_nodes
15
+ response = Excon::Response.new
16
+ response.status = 200
17
+ response.body =
18
+ [
19
+ {
20
+ "rack" => "\/default-rack",
21
+ "state" => "NEW",
22
+ "id" => "h2:1235",
23
+ "nodeHostName" => "h2",
24
+ "nodeHTTPAddress" => "h2:2",
25
+ "healthStatus" => "Healthy",
26
+ "lastHealthUpdate" => 1324056895432,
27
+ "healthReport" => "Healthy",
28
+ "numContainers" => 0,
29
+ "usedMemoryMB" => 0,
30
+ "availMemoryMB" => 8192,
31
+ "usedVirtualCores" => 0,
32
+ "availableVirtualCores" => 8
33
+ },
34
+ {
35
+ "rack" => "\/default-rack",
36
+ "state" => "NEW",
37
+ "id" => "h1:1234",
38
+ "nodeHostName" => "h1",
39
+ "nodeHTTPAddress" => "h1:2",
40
+ "healthStatus" => "Healthy",
41
+ "lastHealthUpdate" => 1324056895092,
42
+ "healthReport" => "Healthy",
43
+ "numContainers" => 0,
44
+ "usedMemoryMB" => 0,
45
+ "availMemoryMB" => 8192,
46
+ "usedVirtualCores" => 0,
47
+ "availableVirtualCores" => 8
48
+ }
49
+ ]
50
+ response
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Hadoop
3
+ class Script < Fog::Service
4
+
5
+ class Real
6
+ include Fog::Hadoop::Utils::Request
7
+
8
+ def initialize(options = {})
9
+
10
+
11
+ @connection = Fog::Core::Connection.new(@service_api_url)
12
+ end
13
+ end
14
+
15
+ class Mock
16
+ def initialize(options={})
17
+ @service_api_url = options[:service_api_url]
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ require 'json'
2
+
3
+ module Fog
4
+ module Hadoop
5
+ module Utils
6
+ module Request
7
+ def request(params)
8
+ response = parse @connection.request(params)
9
+
10
+ response
11
+ ## SakuraCloud API returns Japanese message.
12
+ # This wrapper decodes and show message to be human readble.
13
+ rescue Excon::Errors::HTTPStatusError => e
14
+ Fog::Logger.warning ::JSON.parse(e.response.body)['error_msg']
15
+ raise e
16
+ end
17
+
18
+ private
19
+ def parse(response)
20
+ return response if response.body.empty?
21
+ response.body = Fog::JSON.decode(response.body)
22
+ response
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,5 @@
1
+ module Fog
2
+ module Hadoop
3
+ VERSION = "0.1.1"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ # require 'coveralls'
2
+ # Coveralls.wear!
3
+
4
+ require 'minitest/autorun'
5
+ require 'fog/core'
6
+ require 'fog/openstack'
@@ -0,0 +1,19 @@
1
+ # Supported Hadoop Projects
2
+
3
+ ## Supported
4
+
5
+ | Project | Fog Type | API Version(s) | Compliance | Notes |
6
+ |------------------|---------------|----------------|------------|-------|
7
+ | Yarn | Compute | v1 | TBD | |
8
+ | Hdfs | Volume | v1 | TBD | |
9
+
10
+
11
+
12
+ ## YARN
13
+
14
+ | Service | GET |Notes |
15
+ |------------------|---------------|-------------------------------------|
16
+ | Yarn | Info |/ws/v1/cluster/info |
17
+ | | AppStats |/ws/v1/cluster/appstatistics |
18
+ | | Metrics |/ws/v1/cluster/metrics |
19
+ | | Nodes |/ws/v1/cluster/nodes |
@@ -0,0 +1,44 @@
1
+ Shindo.tests('Fog::Compute[:hadoop] | app stats request', ['hadoop', 'compute']) do
2
+
3
+ @app_stats_format = {
4
+ "state" => String,
5
+ "type" => String,
6
+ "count" => Integer
7
+ }
8
+
9
+ tests('success') do
10
+ tests('#get_app_stats') do
11
+ stats = hadoop_compute_service.get_app_stats
12
+ test 'returns a Hash' do
13
+ stats.body.is_a? Array
14
+ end
15
+ if Fog.mock?
16
+ tests('Info').formats(@app_stats_format, false) do
17
+ stats.body.first
18
+ end
19
+ tests('Info').formats(@app_stats_format, false) do
20
+ stats.body.last
21
+ end
22
+ else
23
+ returns(200) { stats.status }
24
+ returns(true) { stats.body.is_a? Hash }
25
+ end
26
+ end
27
+
28
+ tests('#get_app_stats_detail') do
29
+ stats_detail = hadoop_compute_service.get_app_stats_detail(:states => "accepted")
30
+ test 'returns a Hash' do
31
+ stats_detail.body.is_a? Array
32
+ end
33
+ if Fog.mock?
34
+ tests('Info').formats(@app_stats_format, false) do
35
+ stats_detail.body.first
36
+ end
37
+ else
38
+ returns(200) { stats_detail.status }
39
+ returns(true) { stats_detail.body.is_a? Hash }
40
+ end
41
+ end
42
+ end
43
+ end
44
+