lds-cf-plugin 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,51 @@
1
+ require "cf/cli"
2
+ require "json"
3
+
4
+ module LdsCfPlugin
5
+ class AppDynamicsService < CF::CLI
6
+ def precondition
7
+ check_target
8
+ end
9
+
10
+ desc "Create a App Dynamics Service"
11
+ group :lds, :services
12
+ input :name, :desc => "Name for your service", :argument => :optional
13
+
14
+ def create_app_dynamics_service
15
+ offerings = client.services
16
+ offerings.keep_if { |s| s.label == 'app-dynamics-service' && s.provider == 'ICS' }
17
+ service = offerings.first
18
+
19
+ if !service
20
+ fail "Cannot find App Dynamics service on #{client.target}"
21
+ end
22
+
23
+ if service.version != "0.1"
24
+ fail "Your lds-cf-plugin version is out of date. To update execute `gem update lds-cf-plugin`"
25
+ end
26
+
27
+ rest_client = CFoundry::RestClient.new(service.url, client.token)
28
+ rest_client.trace = client.trace
29
+
30
+ instance_name = input[:name]
31
+ if !instance_name
32
+ instance_name = ask("Name")
33
+ end
34
+
35
+ plan = service.service_plans.first
36
+
37
+ # Create service instance
38
+ instance = client.managed_service_instance
39
+ instance.name = instance_name
40
+
41
+ instance.service_plan = plan
42
+ instance.space = client.current_space
43
+
44
+ with_progress("Creating service #{c(instance.name, :name)}") do
45
+ instance.create!
46
+ end
47
+
48
+ instance
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,14 @@
1
+ module LogsCfPlugin
2
+ class ClientConfig
3
+ attr_reader :loggregator_host, :loggregator_port, :user_token, :output, :trace, :use_ssl
4
+
5
+ def initialize(loggregator_host, loggregator_port, user_token, output, trace, use_ssl = true)
6
+ @output = output
7
+ @loggregator_host = loggregator_host
8
+ @loggregator_port = loggregator_port
9
+ @user_token = user_token
10
+ @trace = trace
11
+ @use_ssl = use_ssl
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ ## Generated from log_message.proto for logmessage
2
+ require "beefcake"
3
+
4
+
5
+ class LogMessage
6
+ include Beefcake::Message
7
+
8
+ module MessageType
9
+ OUT = 1
10
+ ERR = 2
11
+ end
12
+
13
+ required :message, :bytes, 1
14
+ required :message_type, LogMessage::MessageType, 2
15
+ required :timestamp, :sint64, 3
16
+ required :app_id, :string, 4
17
+ optional :source_id, :string, 6
18
+ repeated :drain_urls, :string, 7
19
+ optional :source_name, :string, 8
20
+
21
+ end
22
+
23
+ class LogEnvelope
24
+ include Beefcake::Message
25
+
26
+
27
+ required :routing_key, :string, 1
28
+ required :signature, :bytes, 2
29
+ required :log_message, LogMessage, 3
30
+
31
+ end
@@ -0,0 +1,22 @@
1
+ package logmessage;
2
+
3
+ message LogMessage {
4
+ enum MessageType {
5
+ OUT = 1;
6
+ ERR = 2;
7
+ }
8
+
9
+ required bytes message = 1;
10
+ required MessageType message_type = 2;
11
+ required sint64 timestamp = 3;
12
+ required string app_id = 4;
13
+ optional string source_id = 6;
14
+ repeated string drain_urls = 7;
15
+ optional string source_name = 8;
16
+ }
17
+
18
+ message LogEnvelope {
19
+ required string routing_key = 1;
20
+ required bytes signature = 2;
21
+ required LogMessage log_message = 3;
22
+ }
@@ -0,0 +1,15 @@
1
+ class LogMessage
2
+ def message_type_name
3
+ {MessageType::OUT => "OUT", MessageType::ERR => "ERR"}[message_type]
4
+ end
5
+
6
+ def time=(time)
7
+ self.timestamp = (time.tv_sec * 1000000000) + time.tv_nsec
8
+ end
9
+
10
+ def time
11
+ num_secs = @timestamp / 1000000000
12
+ fractional_usecs = (@timestamp % 1000000000).to_f / 1000
13
+ Time.at(num_secs, fractional_usecs)
14
+ end
15
+ end
@@ -0,0 +1,44 @@
1
+ require 'cf'
2
+ require 'eventmachine'
3
+ require 'faye/websocket'
4
+ require 'uri'
5
+
6
+ module LogsCfPlugin
7
+ require 'lds-cf-plugin/loggregator/message_writer'
8
+ require 'lds-cf-plugin/loggregator/client_config'
9
+ require 'lds-cf-plugin/loggregator/tailling_logs_client'
10
+
11
+ class Plugin < CF::CLI
12
+ include LoginRequirements
13
+ include MessageWriter
14
+
15
+ desc "Tail or dump logs for CF applications"
16
+ group :lds, :diagnostics
17
+ input :app, :desc => "App to tail logs from", :argument => :optional, :from_given => by_name(:app)
18
+ input :recent, :type => :boolean, :desc => "Dump recent logs instead of tailing", :default => false
19
+
20
+ def logs
21
+ client.current_organization.name # resolve org name so CC will validate AuthToken
22
+
23
+ unless input[:app]
24
+ Mothership::Help.command_help(@@commands[:logs])
25
+ fail "Please provide an application to log."
26
+ end
27
+ port = input[:recent] ? nil : 4443
28
+ client_config = ClientConfig.new(loggregator_host, port, client.token.auth_header, STDOUT, input[:trace], use_ssl)
29
+
30
+ TailingLogsClient.new(client_config).logs_for(input[:app], input[:recent])
31
+ end
32
+
33
+ private
34
+
35
+ def loggregator_host
36
+ target_base = client.target.sub(/^https?:\/\/([^\.]+\.)?(.+)\/?/, '\2')
37
+ "loggregator.#{target_base}"
38
+ end
39
+
40
+ def use_ssl
41
+ client.target.start_with?('https')
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,18 @@
1
+ require "cf/cli"
2
+ require "lds-cf-plugin/loggregator/log_message_extender"
3
+
4
+ module MessageWriter
5
+ include CF::Interactive
6
+
7
+ def write(app, output, message)
8
+ msg = [format_time(message.time), "#{message.source_name}/#{message.source_id}", message.message_type_name, message.message].join(" ")
9
+ msg = c(msg.chomp, :error) if message.message_type == LogMessage::MessageType::ERR
10
+ output.puts(msg)
11
+ end
12
+
13
+ private
14
+
15
+ def format_time(time)
16
+ time.strftime("%b %d %H:%M:%S.%3N")
17
+ end
18
+ end
@@ -0,0 +1,101 @@
1
+ require "lds-cf-plugin/loggregator/log_message.pb"
2
+ require "lds-cf-plugin/loggregator/log_message_extender"
3
+
4
+ module LogsCfPlugin
5
+ class TailingLogsClient
6
+ #include CFoundry::TraceHelpers
7
+ include MessageWriter
8
+
9
+ def initialize(config)
10
+ @config = config
11
+ end
12
+
13
+ def logs_for(app, recent)
14
+ protocol = use_ssl ? "wss" : "ws"
15
+ websocket_address = "#{protocol}://#{loggregator_host}#{loggregator_port ? ":#{loggregator_port}" : ""}/#{recent ? 'dump' : 'tail'}/?app=#{app.guid}"
16
+
17
+ output.puts "websocket_address: #{websocket_address}" if trace
18
+
19
+ make_websocket_request(app, websocket_address)
20
+ end
21
+
22
+ def make_websocket_request(app, websocket_address)
23
+ redirect_uri = nil
24
+ @em_client_thread = Thread.new do
25
+ EM.run {
26
+ ws = Faye::WebSocket::Client.new(websocket_address, nil, :headers => {"Origin" => "http://localhost", "Authorization" => user_token})
27
+ ws.on :open do |event|
28
+ output.puts("Connected to server.")
29
+ EventMachine.add_periodic_timer(keep_alive_interval) do
30
+ ws.send("I'm alive!")
31
+ end
32
+ end
33
+
34
+ ws.on :message do |event|
35
+ begin
36
+ received_message = LogMessage.decode(event.data.pack("C*"))
37
+ write(app, output, received_message)
38
+ rescue Exception => e
39
+ output.puts e.message
40
+ output.puts e.backtrace
41
+ output.puts("Error parsing loggregator data. Please make sure you have the latest lds-cf-plugin.")
42
+ ws.close
43
+ end
44
+ end
45
+
46
+ ws.on :error do |event|
47
+ if !redirect_uri
48
+ if event.current_target.status == 302
49
+ redirect_uri = event.current_target.headers["location"]
50
+ ws.close
51
+ @em_client_thread.kill
52
+ ws = nil
53
+ else
54
+ output.puts("Server error: #{websocket_address}")
55
+ output.puts(event.data.inspect) if trace
56
+ end
57
+ end
58
+ end
59
+
60
+ ws.on :close do |event|
61
+ unless redirect_uri
62
+ ws.close
63
+ case event.code
64
+ when 4000
65
+ output.puts("Error: No space given.")
66
+ when 4001
67
+ output.puts("Error: No authorization token given.")
68
+ when 4002
69
+ output.puts("Error: Not authorized.")
70
+ end
71
+ output.puts("Server connection closed.")
72
+ @em_client_thread.kill
73
+ ws = nil
74
+ end
75
+ end
76
+ }
77
+ end
78
+
79
+ wait_for_em_thread_to_finish
80
+
81
+ make_websocket_request(app, redirect_uri) if redirect_uri
82
+ end
83
+
84
+ def wait_for_em_thread_to_finish
85
+ while @em_client_thread.alive? do
86
+ sleep 0.1
87
+ end
88
+ end
89
+
90
+ private
91
+
92
+ attr_reader :config
93
+
94
+ delegate :output, :loggregator_host, :loggregator_port, :user_token, :trace, :use_ssl,
95
+ to: :config
96
+
97
+ def keep_alive_interval
98
+ 25
99
+ end
100
+ end
101
+ end
@@ -6,6 +6,7 @@ Mothership::Help.groups(
6
6
  [:diagnostics, "Diagnostics"]]
7
7
  )
8
8
 
9
+ require "lds-cf-plugin/app_dynamics_service"
9
10
  require "lds-cf-plugin/custom_service"
10
11
  require "lds-cf-plugin/oracle_service"
11
12
  require "lds-cf-plugin/lds_account_service"
@@ -14,3 +15,4 @@ require "lds-cf-plugin/wam_service"
14
15
  require "lds-cf-plugin/servicemanager_service"
15
16
  require "lds-cf-plugin/marklogic_service"
16
17
  require "lds-cf-plugin/tunnel"
18
+ require "lds-cf-plugin/loggregator/logs"
@@ -80,7 +80,7 @@ module LdsCfPlugin
80
80
  end
81
81
 
82
82
  prexisting = input[:prexisting]
83
- prexisting = ask("Use existing Service Manager application CI for '#{sm_app_name}'?", :default => true) if !prexisting
83
+ prexisting = ask("Use existing Service Manager CI for '#{sm_app_name} - #{env}'?", :default => true) if !prexisting
84
84
 
85
85
  if prexisting
86
86
  payload = {
@@ -137,7 +137,8 @@ module LdsCfPlugin
137
137
  :SuuportContactReason => "Primary Contact",
138
138
  :PortfolioId => portfolioId,
139
139
  :RegStandards => "None",
140
- :SystemRiskLevel => "Low Risk"
140
+ :SystemRiskLevel => "Low Risk",
141
+ :prexisting => false
141
142
  }
142
143
  end
143
144
 
@@ -1,3 +1,3 @@
1
1
  module LdsCfPlugin
2
- VERSION = "0.3.5".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lds-cf-plugin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-06 00:00:00.000000000 Z
12
+ date: 2014-01-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cf
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 5.4.4
21
+ version: 5.4.5
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 5.4.4
29
+ version: 5.4.5
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: eventmachine
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +59,38 @@ dependencies:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.6'
62
+ - !ruby/object:Gem::Dependency
63
+ name: beefcake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.3.7
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.3.7
78
+ - !ruby/object:Gem::Dependency
79
+ name: faye-websocket
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.6.1
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.6.1
62
94
  description:
63
95
  email:
64
96
  - heathma@ldschurch.org
@@ -75,10 +107,18 @@ files:
75
107
  - lib/lds-cf-plugin/tunnel.rb
76
108
  - lib/lds-cf-plugin/version.rb
77
109
  - lib/lds-cf-plugin/plugin.rb
110
+ - lib/lds-cf-plugin/app_dynamics_service.rb
111
+ - lib/lds-cf-plugin/loggregator/log_message_extender.rb
112
+ - lib/lds-cf-plugin/loggregator/tailling_logs_client.rb
113
+ - lib/lds-cf-plugin/loggregator/client_config.rb
114
+ - lib/lds-cf-plugin/loggregator/log_message.pb.rb
115
+ - lib/lds-cf-plugin/loggregator/message_writer.rb
116
+ - lib/lds-cf-plugin/loggregator/logs.rb
117
+ - lib/lds-cf-plugin/loggregator/log_message.proto
78
118
  - lib/lds-cf-plugin/tunnel/tunnelclient.rb
79
119
  - lib/lds-cf-plugin/wam_service.rb
80
120
  - lib/lds-cf-plugin/servicemanager_service.rb
81
- homepage: http://ui.app.lds.org/
121
+ homepage: https://cf.lds.org/
82
122
  licenses: []
83
123
  post_install_message:
84
124
  rdoc_options: []