datadog-sdk-testing 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +24 -0
- data/README.md +30 -0
- data/lib/config/README.md +32 -0
- data/lib/config/check.py +17 -0
- data/lib/config/ci/skeleton.rake +69 -0
- data/lib/config/conf.yaml.example +6 -0
- data/lib/config/manifest.json +10 -0
- data/lib/config/metadata.csv +0 -0
- data/lib/config/requirements.txt +1 -0
- data/lib/config/test_skeleton.py +34 -0
- data/lib/tasks/ci/common.rb +215 -0
- data/lib/tasks/ci/default.rb +67 -0
- data/lib/tasks/ci/hooks/pre-commit.py +65 -0
- data/lib/tasks/sdk.rake +152 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c74227db510a81eea5631e7c0662c75877555dc3
|
4
|
+
data.tar.gz: ae7bd7b68c6ad64cc41b09d587495ae3be1a26c0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 174b4496355eef80152159b344a655476e78cf6207018b0ea0aa9c49e1360afcf9709833bdb3bc43daab35e59dd76f0474aff1be3df0b1f950b34b92b3a7c947
|
7
|
+
data.tar.gz: 3bd3194d905f302cb0609ee35fc0c47e1c1df2db1429376b0c335bf713607b0fd7d60d22e6a61df2c14fedcfa7a27bec4072d1bd90b8d371504def0b0a86057f
|
data/LICENSE
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
Copyright (c) 2015, Datadog <info@datadoghq.com>
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
* Redistributions of source code must retain the above copyright
|
7
|
+
notice, this list of conditions and the following disclaimer.
|
8
|
+
* Redistributions in binary form must reproduce the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer in the
|
10
|
+
documentation and/or other materials provided with the distribution.
|
11
|
+
* Neither the name of Datadog nor the
|
12
|
+
names of its contributors may be used to endorse or promote products
|
13
|
+
derived from this software without specific prior written permission.
|
14
|
+
|
15
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
16
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
17
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
19
|
+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
20
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
21
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
22
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
23
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
24
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# datadog-sdk-testing
|
2
|
+
Gem repo providing Integration SDK testing/scaffolding facilities (unpublished).
|
3
|
+
|
4
|
+
## usage
|
5
|
+
This gem essentially just provides a set of rake tasks to help you get up and running with integration testing and scaffolding. We expect to use this gem in `integrations-core` and `integrations-extras`.
|
6
|
+
|
7
|
+
To use the tasks in this gem just add a Rakefile to the relevant project with these contents:
|
8
|
+
|
9
|
+
```
|
10
|
+
#!/usr/bin/env rake
|
11
|
+
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
unless ENV['CI']
|
15
|
+
rakefile_dir = File.dirname(__FILE__)
|
16
|
+
ENV['TRAVIS_BUILD_DIR'] = rakefile_dir
|
17
|
+
ENV['INTEGRATIONS_DIR'] = File.join(rakefile_dir, 'embedded')
|
18
|
+
ENV['PIP_CACHE'] = File.join(rakefile_dir, '.cache/pip')
|
19
|
+
ENV['VOLATILE_DIR'] = '/tmp/integration-sdk-testing'
|
20
|
+
ENV['CONCURRENCY'] = ENV['CONCURRENCY'] || '2'
|
21
|
+
ENV['NOSE_FILTER'] = 'not windows'
|
22
|
+
ENV['RUN_VENV'] = 'true'
|
23
|
+
ENV['SDK_TESTING'] = 'true'
|
24
|
+
end
|
25
|
+
|
26
|
+
ENV['SDK_HOME'] = File.dirname(__FILE__)
|
27
|
+
|
28
|
+
spec = Gem::Specification.find_by_name 'datadog-sdk-testing'
|
29
|
+
load "#{spec.gem_dir}/lib/tasks/sdk.rake"
|
30
|
+
```
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Skeleton Integration
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
Get metrics from skeleton service in real time to:
|
6
|
+
|
7
|
+
* Visualize and monitor skeleton states
|
8
|
+
* Be notified about skeleton failovers and events.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Install the `dd-check-skeleton` package manually or with your favorite configuration manager
|
13
|
+
|
14
|
+
## Configuration
|
15
|
+
|
16
|
+
Edit the `skeleton.yaml` file to point to your server and port, set the masters to monitor
|
17
|
+
|
18
|
+
## Validation
|
19
|
+
|
20
|
+
When you run `datadog-agent info` you should see something like the following:
|
21
|
+
|
22
|
+
Checks
|
23
|
+
======
|
24
|
+
|
25
|
+
skeleton
|
26
|
+
-----------
|
27
|
+
- instance #0 [OK]
|
28
|
+
- Collected 39 metrics, 0 events & 7 service checks
|
29
|
+
|
30
|
+
## Compatibility
|
31
|
+
|
32
|
+
The skeleton check is compatible with all major platforms
|
data/lib/config/check.py
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# stdlib
|
2
|
+
|
3
|
+
# 3rd party
|
4
|
+
|
5
|
+
# project
|
6
|
+
from checks import AgentCheck
|
7
|
+
|
8
|
+
EVENT_TYPE = SOURCE_TYPE_NAME = 'skeleton'
|
9
|
+
|
10
|
+
|
11
|
+
class SkeletonCheck(AgentCheck):
|
12
|
+
|
13
|
+
def __init__(self, name, init_config, agentConfig, instances=None):
|
14
|
+
AgentCheck.__init__(self, name, init_config, agentConfig, instances)
|
15
|
+
|
16
|
+
def check(self, instance):
|
17
|
+
pass
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'ci/common'
|
2
|
+
|
3
|
+
def skeleton_version
|
4
|
+
ENV['FLAVOR_VERSION'] || '2.4.12'
|
5
|
+
end
|
6
|
+
|
7
|
+
def skeleton_rootdir
|
8
|
+
"#{ENV['INTEGRATIONS_DIR']}/skeleton_#{skeleton_version}"
|
9
|
+
end
|
10
|
+
|
11
|
+
namespace :ci do
|
12
|
+
namespace :skeleton do |flavor|
|
13
|
+
task before_install: ['ci:common:before_install']
|
14
|
+
|
15
|
+
task install: ['ci:common:install'] do
|
16
|
+
use_venv = in_venv
|
17
|
+
install_requirements('skeleton/requirements.txt',
|
18
|
+
"--cache-dir #{ENV['PIP_CACHE']}",
|
19
|
+
"#{ENV['VOLATILE_DIR']}/ci.log", use_venv)
|
20
|
+
# sample docker usage
|
21
|
+
# sh %(docker create -p XXX:YYY --name skeleton source/skeleton)
|
22
|
+
# sh %(docker start skeleton)
|
23
|
+
end
|
24
|
+
|
25
|
+
task before_script: ['ci:common:before_script']
|
26
|
+
|
27
|
+
task :script, [:mocked] => ['ci:common:script'] do |_, attr|
|
28
|
+
ci_home = File.dirname(__FILE__)
|
29
|
+
mocked = attr[:mocked] || false
|
30
|
+
this_provides = [
|
31
|
+
'skeleton'
|
32
|
+
]
|
33
|
+
Rake::Task['ci:common:run_tests'].invoke(this_provides, ci_home, mocked)
|
34
|
+
end
|
35
|
+
|
36
|
+
task before_cache: ['ci:common:before_cache']
|
37
|
+
|
38
|
+
task cleanup: ['ci:common:cleanup']
|
39
|
+
# sample cleanup task
|
40
|
+
# task cleanup: ['ci:common:cleanup'] do
|
41
|
+
# sh %(docker stop skeleton)
|
42
|
+
# sh %(docker rm skeleton)
|
43
|
+
# end
|
44
|
+
|
45
|
+
task :execute, :mocked do |_, attr|
|
46
|
+
mocked = attr[:mocked] || false
|
47
|
+
exception = nil
|
48
|
+
begin
|
49
|
+
if not mocked
|
50
|
+
%w(before_install install before_script).each do |u|
|
51
|
+
Rake::Task["#{flavor.scope.path}:#{u}"].invoke
|
52
|
+
end
|
53
|
+
end
|
54
|
+
Rake::Task["#{flavor.scope.path}:script"].invoke(mocked)
|
55
|
+
Rake::Task["#{flavor.scope.path}:before_cache"].invoke
|
56
|
+
rescue => e
|
57
|
+
exception = e
|
58
|
+
puts "Failed task: #{e.class} #{e.message}".red
|
59
|
+
end
|
60
|
+
if ENV['SKIP_CLEANUP']
|
61
|
+
puts 'Skipping cleanup, disposable environments are great'.yellow
|
62
|
+
else
|
63
|
+
puts 'Cleaning up'
|
64
|
+
Rake::Task["#{flavor.scope.path}:cleanup"].invoke
|
65
|
+
end
|
66
|
+
raise exception if exception
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
# integration pip requirements
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# stdlib
|
2
|
+
from nose.plugins.attrib import attr
|
3
|
+
|
4
|
+
# 3p
|
5
|
+
|
6
|
+
# project
|
7
|
+
from tests.checks.common import AgentCheckTest
|
8
|
+
|
9
|
+
|
10
|
+
instance = {
|
11
|
+
'host': 'localhost',
|
12
|
+
'port': 26379,
|
13
|
+
'password': 'datadog-is-devops-best-friend'
|
14
|
+
}
|
15
|
+
|
16
|
+
|
17
|
+
# NOTE: Feel free to declare multiple test classes if needed
|
18
|
+
|
19
|
+
@attr(requires='skeleton', mock=False) # set mock to True if appropriate
|
20
|
+
class TestSkeleton(AgentCheckTest):
|
21
|
+
"""Basic Test for skeleton integration."""
|
22
|
+
CHECK_NAME = 'skeleton'
|
23
|
+
|
24
|
+
def test_check(self):
|
25
|
+
"""
|
26
|
+
Testing Skeleton check.
|
27
|
+
"""
|
28
|
+
self.load_check({}, {})
|
29
|
+
|
30
|
+
# run your actual tests...
|
31
|
+
|
32
|
+
self.assertTrue(True)
|
33
|
+
# Raises when COVERAGE=true and coverage < 100%
|
34
|
+
self.coverage_report()
|
@@ -0,0 +1,215 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
require 'httparty'
|
3
|
+
require 'socket'
|
4
|
+
require 'time'
|
5
|
+
require 'timeout'
|
6
|
+
|
7
|
+
# Colors don't work on Appveyor
|
8
|
+
String.disable_colorization = true if Gem.win_platform?
|
9
|
+
|
10
|
+
|
11
|
+
def check_env
|
12
|
+
abort 'SDK_HOME env variable must be defined in your Rakefile to used this gem.' unless ENV['SDK_HOME']
|
13
|
+
end
|
14
|
+
|
15
|
+
def sleep_for(secs)
|
16
|
+
puts "Sleeping for #{secs}s".blue
|
17
|
+
sleep(secs)
|
18
|
+
end
|
19
|
+
|
20
|
+
def section(name)
|
21
|
+
timestamp = Time.now.utc.iso8601
|
22
|
+
puts ''
|
23
|
+
puts "[#{timestamp}] >>>>>>>>>>>>>> #{name} STAGE".black.on_white
|
24
|
+
puts ''
|
25
|
+
end
|
26
|
+
|
27
|
+
def in_venv
|
28
|
+
ENV['RUN_VENV'] && ENV['RUN_VENV'] == 'true' ? true : false
|
29
|
+
end
|
30
|
+
|
31
|
+
def install_requirements(req_file, pip_options = nil, output = nil, use_venv = nil)
|
32
|
+
pip_command = use_venv ? "#{ENV['SDK_HOME']}/venv/bin/pip" : 'pip'
|
33
|
+
redirect_output = output ? "2>&1 >> #{output}" : ''
|
34
|
+
pip_options = '' if pip_options.nil?
|
35
|
+
File.exist?(req_file) && File.open(req_file, 'r') do |f|
|
36
|
+
f.each_line do |line|
|
37
|
+
line.strip!
|
38
|
+
unless line.empty? || line.start_with?('#')
|
39
|
+
sh %(#{pip_command} install #{line} #{pip_options} #{redirect_output}\
|
40
|
+
|| echo 'Unable to install #{line}' #{redirect_output})
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_files(sdk_dir)
|
47
|
+
Dir.glob(File.join(sdk_dir, '**/test_*.py')).reject do |path|
|
48
|
+
!%r{#{sdk_dir}/embedded/.*$}.match(path).nil? || !%r{#{sdk_dir}\/venv\/.*$}.match(path).nil?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def integration_tests(ci_dir)
|
53
|
+
sdk_dir = File.join(ci_dir, '..')
|
54
|
+
integrations = []
|
55
|
+
untested = []
|
56
|
+
testable = []
|
57
|
+
test_files(sdk_dir).each do |check|
|
58
|
+
integration_name = /test_((\w|_)+).py$/.match(check)[1]
|
59
|
+
integrations.push(integration_name)
|
60
|
+
if Dir.exist?(File.join(sdk_dir, integration_name))
|
61
|
+
testable.push(check)
|
62
|
+
else
|
63
|
+
untested.push(check)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
[testable, untested]
|
67
|
+
end
|
68
|
+
|
69
|
+
# helper class to wait for TCP/HTTP services to boot
|
70
|
+
class Wait
|
71
|
+
DEFAULT_TIMEOUT = 10
|
72
|
+
|
73
|
+
def self.check_port(port)
|
74
|
+
Timeout.timeout(0.5) do
|
75
|
+
begin
|
76
|
+
s = TCPSocket.new('localhost', port)
|
77
|
+
s.close
|
78
|
+
return true
|
79
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
80
|
+
return false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
rescue Timeout::Error
|
84
|
+
return false
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.check_url(url)
|
88
|
+
Timeout.timeout(0.5) do
|
89
|
+
begin
|
90
|
+
r = HTTParty.get(url)
|
91
|
+
return (200...300).cover? r.code
|
92
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
93
|
+
return false
|
94
|
+
end
|
95
|
+
end
|
96
|
+
rescue Timeout::Error
|
97
|
+
return false
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.check_file(file_path)
|
101
|
+
File.exist?(file_path)
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.check(smth)
|
105
|
+
if smth.is_a? Integer
|
106
|
+
check_port smth
|
107
|
+
elsif smth.include? 'http'
|
108
|
+
check_url smth
|
109
|
+
else
|
110
|
+
check_file smth
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.for(smth, max_timeout = DEFAULT_TIMEOUT)
|
115
|
+
start_time = Time.now
|
116
|
+
status = false
|
117
|
+
n = 1
|
118
|
+
puts "Trying #{smth}"
|
119
|
+
loop do
|
120
|
+
puts n.to_s
|
121
|
+
status = check(smth)
|
122
|
+
break if status || Time.now > start_time + max_timeout
|
123
|
+
n += 1
|
124
|
+
sleep 0.25
|
125
|
+
end
|
126
|
+
raise "Still not up after #{max_timeout}s" unless status
|
127
|
+
puts 'Found!'
|
128
|
+
status
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
namespace :ci do
|
133
|
+
namespace :common do
|
134
|
+
task :before_install do |t|
|
135
|
+
section('BEFORE_INSTALL')
|
136
|
+
# We use tempdir on Windows, no need to create it
|
137
|
+
sh %(mkdir -p #{ENV['VOLATILE_DIR']}) unless Gem.win_platform?
|
138
|
+
t.reenable
|
139
|
+
end
|
140
|
+
|
141
|
+
task :install do |t|
|
142
|
+
section('INSTALL')
|
143
|
+
use_venv = in_venv
|
144
|
+
pip_command = use_venv ? 'venv/bin/pip' : 'pip'
|
145
|
+
sh %(#{'python -m ' if Gem.win_platform?}#{pip_command} install --upgrade pip setuptools)
|
146
|
+
install_requirements('requirements.txt',
|
147
|
+
"--cache-dir #{ENV['PIP_CACHE']}",
|
148
|
+
"#{ENV['VOLATILE_DIR']}/ci.log", use_venv)
|
149
|
+
install_requirements('requirements-opt.txt',
|
150
|
+
"--upgrade --cache-dir #{ENV['PIP_CACHE']}",
|
151
|
+
"#{ENV['VOLATILE_DIR']}/ci.log", use_venv)
|
152
|
+
install_requirements('requirements-test.txt',
|
153
|
+
"--cache-dir #{ENV['PIP_CACHE']}",
|
154
|
+
"#{ENV['VOLATILE_DIR']}/ci.log", use_venv)
|
155
|
+
t.reenable
|
156
|
+
end
|
157
|
+
|
158
|
+
task :before_script do |t|
|
159
|
+
section('BEFORE_SCRIPT')
|
160
|
+
t.reenable
|
161
|
+
end
|
162
|
+
|
163
|
+
task :script do |t|
|
164
|
+
section('SCRIPT')
|
165
|
+
t.reenable
|
166
|
+
end
|
167
|
+
|
168
|
+
task :before_cache do |t|
|
169
|
+
section('BEFORE_CACHE')
|
170
|
+
t.reenable
|
171
|
+
end
|
172
|
+
|
173
|
+
task :cleanup do |t|
|
174
|
+
section('CLEANUP')
|
175
|
+
t.reenable
|
176
|
+
end
|
177
|
+
|
178
|
+
task :run_tests, [:flavor, :cihome, :mocked] do |t, attr|
|
179
|
+
flavors = attr[:flavor]
|
180
|
+
cihome = attr[:cihome]
|
181
|
+
mocked = attr[:mocked] || false
|
182
|
+
filter = ENV['NOSE_FILTER'] || '1'
|
183
|
+
nose_command = in_venv ? 'venv/bin/nosetests' : 'nosetests'
|
184
|
+
|
185
|
+
mock_filter = mocked ? "mock" : "not mock"
|
186
|
+
nose = if flavors.include?('default')
|
187
|
+
"(not requires) and #{filter} and #{mock_filter}"
|
188
|
+
else
|
189
|
+
"(requires in ['#{flavors.join("','")}']) and #{filter} and #{mock_filter}"
|
190
|
+
end
|
191
|
+
|
192
|
+
tests_directory, = integration_tests(cihome)
|
193
|
+
unless flavors.include?('default')
|
194
|
+
tests_directory = tests_directory.reject do |test|
|
195
|
+
/.*#{flavors}.*$/.match(test).nil?
|
196
|
+
end
|
197
|
+
end
|
198
|
+
# Rake on Windows doesn't support setting the var at the beginning of the
|
199
|
+
# command
|
200
|
+
path = ''
|
201
|
+
unless Gem.win_platform?
|
202
|
+
# FIXME: make the other filters than param configurable
|
203
|
+
# For integrations that cannot be easily installed in a
|
204
|
+
# separate dir we symlink stuff in the rootdir
|
205
|
+
path = %(PATH="#{ENV['INTEGRATIONS_DIR']}/bin:#{ENV['PATH']}" )
|
206
|
+
end
|
207
|
+
tests_directory.each do |testdir|
|
208
|
+
sh %(#{path}#{nose_command} -s -v -A "#{nose}" #{testdir})
|
209
|
+
end
|
210
|
+
t.reenable
|
211
|
+
end
|
212
|
+
|
213
|
+
task execute: [:before_install, :install, :before_script, :script]
|
214
|
+
end
|
215
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
require 'ci/common'
|
4
|
+
require 'bundler'
|
5
|
+
|
6
|
+
namespace :ci do
|
7
|
+
namespace :default do |flavor|
|
8
|
+
task before_install: ['ci:common:before_install']
|
9
|
+
|
10
|
+
task :coverage do
|
11
|
+
check_env
|
12
|
+
testable, untested = integration_tests(File.dirname(__FILE__))
|
13
|
+
total_checks = (untested + testable).length
|
14
|
+
unless untested.empty?
|
15
|
+
puts "Untested checks (#{untested.length}/#{total_checks})".red
|
16
|
+
puts '-----------------------'.red
|
17
|
+
untested.each { |check_name| puts check_name.red }
|
18
|
+
puts ''
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
task install: ['ci:common:install']
|
23
|
+
|
24
|
+
task before_script: ['ci:common:before_script']
|
25
|
+
|
26
|
+
task lint: ['rubocop'] do
|
27
|
+
check_env
|
28
|
+
sh %(flake8 #{ENV['SDK_HOME']})
|
29
|
+
sh %(find #{ENV['SDK_HOME']} -name '*.py' -not\
|
30
|
+
\\( -path '*.cache*' -or -path '*embedded*' -or -path '*venv*' -or -path '*.git*' \\)\
|
31
|
+
| xargs -n 1 pylint --rcfile=#{ENV['SDK_HOME']}/.pylintrc)
|
32
|
+
end
|
33
|
+
|
34
|
+
task :requirements do
|
35
|
+
check_env
|
36
|
+
gem_home = Bundler.rubygems.find_name('datadog-sdk-testing').first.full_gem_path
|
37
|
+
sh "#{gem_home}/lib/tasks/ci/hooks/pre-commit.py"
|
38
|
+
end
|
39
|
+
|
40
|
+
task script: ['ci:common:script', :coverage, :lint] do
|
41
|
+
check_env
|
42
|
+
Rake::Task['ci:common:run_tests'].invoke(['default'])
|
43
|
+
end
|
44
|
+
|
45
|
+
task cleanup: ['ci:common:cleanup']
|
46
|
+
|
47
|
+
task :execute do
|
48
|
+
exception = nil
|
49
|
+
begin
|
50
|
+
%w(before_install install before_script
|
51
|
+
script).each do |t|
|
52
|
+
Rake::Task["#{flavor.scope.path}:#{t}"].invoke
|
53
|
+
end
|
54
|
+
rescue => e
|
55
|
+
exception = e
|
56
|
+
puts "Failed task: #{e.class} #{e.message}".red
|
57
|
+
end
|
58
|
+
if ENV['SKIP_CLEANUP']
|
59
|
+
puts 'Skipping cleanup, disposable environments are great'.yellow
|
60
|
+
else
|
61
|
+
puts 'Cleaning up'
|
62
|
+
Rake::Task["#{flavor.scope.path}:cleanup"].invoke
|
63
|
+
end
|
64
|
+
raise exception if exception
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
|
3
|
+
import fnmatch
|
4
|
+
import os
|
5
|
+
import sys
|
6
|
+
|
7
|
+
OK = 0
|
8
|
+
ERR = 1
|
9
|
+
|
10
|
+
def get_files(fname):
|
11
|
+
matches = []
|
12
|
+
for root, dirnames, filenames in os.walk('.'):
|
13
|
+
for filename in fnmatch.filter(filenames, fname):
|
14
|
+
matches.append(os.path.join(root, filename))
|
15
|
+
|
16
|
+
return matches
|
17
|
+
|
18
|
+
|
19
|
+
def process_requirements(reqs, fname):
|
20
|
+
SPECIFIERS = ['==', '!=' '<=', '>=', '<', '>']
|
21
|
+
|
22
|
+
print "processing... {}".format(fname)
|
23
|
+
with open(fname) as f:
|
24
|
+
content = f.readlines()
|
25
|
+
|
26
|
+
for line in content:
|
27
|
+
line = "".join(line.split())
|
28
|
+
for specifier in SPECIFIERS:
|
29
|
+
idx = line.find(specifier)
|
30
|
+
if idx < 0:
|
31
|
+
continue
|
32
|
+
|
33
|
+
req = line[:idx]
|
34
|
+
specifier = line[idx:]
|
35
|
+
|
36
|
+
if req in reqs and reqs[req][0] != specifier:
|
37
|
+
# version mismatch
|
38
|
+
print "There's a version mismatch with {req} " \
|
39
|
+
" {spec} and {prev_spec} defined in {src}.".format(
|
40
|
+
req=req,
|
41
|
+
spec=specifier,
|
42
|
+
prev_spec=reqs[req][0],
|
43
|
+
src=reqs[req][1]
|
44
|
+
)
|
45
|
+
sys.exit(ERR)
|
46
|
+
elif req not in reqs:
|
47
|
+
reqs[req] = (specifier, fname)
|
48
|
+
break
|
49
|
+
|
50
|
+
|
51
|
+
requirements = {}
|
52
|
+
files = get_files('requirements.txt')
|
53
|
+
|
54
|
+
for f in files:
|
55
|
+
process_requirements(requirements, f)
|
56
|
+
|
57
|
+
print "No requirement version conflicts found. Looking good... ;)"
|
58
|
+
for req, spec in requirements.iteritems():
|
59
|
+
print "{req}{spec} first found in {fname}".format(
|
60
|
+
req=req,
|
61
|
+
spec=spec[0],
|
62
|
+
fname=spec[1]
|
63
|
+
)
|
64
|
+
|
65
|
+
sys.exit(OK)
|
data/lib/tasks/sdk.rake
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
# encoding: utf-8
|
3
|
+
# 3p
|
4
|
+
require 'rake/clean'
|
5
|
+
require 'rubocop/rake_task'
|
6
|
+
require 'bundler'
|
7
|
+
|
8
|
+
# Flavored Travis CI jobs
|
9
|
+
require 'ci/default'
|
10
|
+
Rake.add_rakelib './ci/'
|
11
|
+
|
12
|
+
CLOBBER.include '**/*.pyc'
|
13
|
+
|
14
|
+
desc 'Setup a development environment for the SDK'
|
15
|
+
task 'setup_env' do
|
16
|
+
check_env
|
17
|
+
`mkdir -p #{ENV['SDK_HOME']}/venv`
|
18
|
+
`wget -q -O #{ENV['SDK_HOME']}/venv/virtualenv.py https://raw.github.com/pypa/virtualenv/1.11.6/virtualenv.py`
|
19
|
+
`python #{ENV['SDK_HOME']}/venv/virtualenv.py --no-site-packages --no-pip --no-setuptools #{ENV['SDK_HOME']}/venv/`
|
20
|
+
`wget -q -O #{ENV['SDK_HOME']}/venv/ez_setup.py https://bootstrap.pypa.io/ez_setup.py`
|
21
|
+
`#{ENV['SDK_HOME']}/venv/bin/python #{ENV['SDK_HOME']}/venv/ez_setup.py`
|
22
|
+
`wget -q -O #{ENV['SDK_HOME']}/venv/get-pip.py https://bootstrap.pypa.io/get-pip.py`
|
23
|
+
`#{ENV['SDK_HOME']}/venv/bin/python #{ENV['SDK_HOME']}/venv/get-pip.py`
|
24
|
+
# these files should be part of the SDK repos (integrations-{core, extra}
|
25
|
+
`venv/bin/pip install -r #{ENV['SDK_HOME']}/requirements.txt` if File.exist?('requirements.txt')
|
26
|
+
`venv/bin/pip install -r #{ENV['SDK_HOME']}/requirements-test.txt` if File.exist?('requirements-test.txt')
|
27
|
+
# These deps are not really needed, so we ignore failures
|
28
|
+
ENV['PIP_COMMAND'] = "#{ENV['SDK_HOME']}/venv/bin/pip"
|
29
|
+
`git clone https://github.com/DataDog/dd-agent.git #{ENV['SDK_HOME']}/embedded/dd-agent`
|
30
|
+
# install agent core dependencies
|
31
|
+
`#{ENV['SDK_HOME']}/venv/bin/pip install -r #{ENV['SDK_HOME']}/embedded/dd-agent/requirements.txt`
|
32
|
+
`echo "#{ENV['SDK_HOME']}/embedded/dd-agent/" > #{ENV['SDK_HOME']}/venv/lib/python2.7/site-packages/datadog-agent.pth`
|
33
|
+
end
|
34
|
+
|
35
|
+
desc 'Clean development environment for the SDK (remove!)'
|
36
|
+
task 'clean_env' do
|
37
|
+
check_env
|
38
|
+
input = ''
|
39
|
+
print "Are you sure you want to delete the SDK environment (y/n)? "
|
40
|
+
input = STDIN.gets.chomp
|
41
|
+
case input.upcase
|
42
|
+
when "Y"
|
43
|
+
`rm -rf #{ENV['SDK_HOME']}/venv` if File.directory?("#{ENV['SDK_HOME']}/venv")
|
44
|
+
`rm -rf #{ENV['SDK_HOME']}/embedded` if File.directory?("#{ENV['SDK_HOME']}/embedded")
|
45
|
+
puts "virtual environment, agent source removed."
|
46
|
+
when "N"
|
47
|
+
puts "aborting the task..."
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
desc 'Setup git hooks'
|
52
|
+
task 'setup_hooks' do
|
53
|
+
check_env
|
54
|
+
gem_home = Bundler.rubygems.find_name('datadog-sdk-testing').first.full_gem_path
|
55
|
+
sh "ln -sf #{gem_home}/lib/tasks/ci/hooks/pre-commit.py #{ENV['SDK_HOME']}}/.git/hooks/pre-commit"
|
56
|
+
end
|
57
|
+
|
58
|
+
desc 'Pull latest agent code'
|
59
|
+
task 'pull_latest_agent' do
|
60
|
+
check_env
|
61
|
+
`cd #{ENV['SDK_HOME']}/embedded/dd-agent && git fetch -p && git pull && cd -`
|
62
|
+
end
|
63
|
+
|
64
|
+
namespace :test do
|
65
|
+
desc 'cProfile tests, then run pstats'
|
66
|
+
task 'profile:pstats' => ['test:profile'] do
|
67
|
+
check_env
|
68
|
+
sh 'python -m pstats stats.dat'
|
69
|
+
end
|
70
|
+
|
71
|
+
desc 'Display test coverage for checks'
|
72
|
+
task 'coverage' => 'ci:default:coverage'
|
73
|
+
end
|
74
|
+
|
75
|
+
RuboCop::RakeTask.new(:rubocop) do |t|
|
76
|
+
t.patterns = ['ci/**/*.rb', 'Gemfile', 'Rakefile']
|
77
|
+
end
|
78
|
+
|
79
|
+
desc 'Lint the code through pylint'
|
80
|
+
task 'lint' => ['ci:default:lint'] do
|
81
|
+
end
|
82
|
+
|
83
|
+
desc 'Find requirements conflicts'
|
84
|
+
task 'requirements' => ['ci:default:requirements'] do
|
85
|
+
end
|
86
|
+
|
87
|
+
namespace :generate do
|
88
|
+
desc 'Setup a development environment for the SDK'
|
89
|
+
task :skeleton, :option do |_, args|
|
90
|
+
check_env
|
91
|
+
puts "generating skeleton files for #{args[:option]}"
|
92
|
+
gem_home = Bundler.rubygems.find_name('datadog-sdk-testing').first.full_gem_path
|
93
|
+
capitalized = args[:option].capitalize
|
94
|
+
sh "mkdir -p #{ENV['SDK_HOME']}/ci"
|
95
|
+
sh "mkdir -p #{ENV['SDK_HOME']}/#{args[:option]}"
|
96
|
+
sh "cp #{gem_home}/lib/config/ci/skeleton.rake #{ENV['SDK_HOME']}/ci/#{args[:option]}.rake"
|
97
|
+
sh "cp #{gem_home}/lib/config/manifest.json #{ENV['SDK_HOME']}/#{args[:option]}/manifest.json"
|
98
|
+
sh "cp #{gem_home}/lib/config/check.py #{ENV['SDK_HOME']}/#{args[:option]}/check.py"
|
99
|
+
sh "cp #{gem_home}/lib/config/test_skeleton.py #{ENV['SDK_HOME']}/#{args[:option]}/test_#{args[:option]}.py"
|
100
|
+
sh "cp #{gem_home}/lib/config/metadata.csv #{ENV['SDK_HOME']}/#{args[:option]}/metadata.csv"
|
101
|
+
sh "cp #{gem_home}/lib/config/requirements.txt #{ENV['SDK_HOME']}/#{args[:option]}/requirements.txt"
|
102
|
+
sh "cp #{gem_home}/lib/config/README.md #{ENV['SDK_HOME']}/#{args[:option]}/README.md"
|
103
|
+
sh "find #{ENV['SDK_HOME']}/#{args[:option]} -type f -exec sed -i '' \"s/skeleton/#{args[:option]}/g\" {} \\;"
|
104
|
+
sh "find #{ENV['SDK_HOME']}/#{args[:option]} -type f -exec sed -i '' \"s/Skeleton/#{capitalized}/g\" {} \\;"
|
105
|
+
sh "sed -i '' \"s/skeleton/#{args[:option]}/g\" #{ENV['SDK_HOME']}/ci/#{args[:option]}.rake"
|
106
|
+
sh "sed -i '' \"s/Skeleton/#{capitalized}/g\" #{ENV['SDK_HOME']}/ci/#{args[:option]}.rake"
|
107
|
+
sh "git add #{ENV['SDK_HOME']}/ci/#{args[:option]}.rake"
|
108
|
+
sh "git add #{ENV['SDK_HOME']}/#{args[:option]}/*"
|
109
|
+
|
110
|
+
new_file = "#{ENV['SDK_HOME']}/circle.yml.new"
|
111
|
+
File.open(new_file, 'w') do |fo|
|
112
|
+
File.foreach("#{ENV['SDK_HOME']}/circle.yml") do |line|
|
113
|
+
fo.puts " - rake ci:run[#{args[:option]}]" if line =~ /bundle\ exec\ rake\ requirements/
|
114
|
+
fo.puts line
|
115
|
+
end
|
116
|
+
end
|
117
|
+
File.delete("#{ENV['SDK_HOME']}/circle.yml")
|
118
|
+
File.rename(new_file, "#{ENV['SDK_HOME']}/circle.yml")
|
119
|
+
|
120
|
+
new_file = "#{ENV['SDK_HOME']}/.travis.yml.new"
|
121
|
+
File.open(new_file, 'w') do |fo|
|
122
|
+
File.foreach("#{ENV['SDK_HOME']}/.travis.yml") do |line|
|
123
|
+
fo.puts " - rake ci:run[#{args[:option]}]" if line =~ /bundle\ exec\ rake\ requirements/
|
124
|
+
fo.puts line
|
125
|
+
end
|
126
|
+
end
|
127
|
+
File.delete("#{ENV['SDK_HOME']}/.travis.yml")
|
128
|
+
File.rename(new_file, "#{ENV['SDK_HOME']}/.travis.yml")
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
namespace :ci do
|
133
|
+
desc 'Run integration tests'
|
134
|
+
task :run, [:flavor, :mocked] do |_, args|
|
135
|
+
check_env
|
136
|
+
puts 'Assuming you are running these tests locally' unless ENV['TRAVIS']
|
137
|
+
flavor = args[:flavor] || ENV['TRAVIS_FLAVOR'] || 'default'
|
138
|
+
mocked = args[:mocked] || false
|
139
|
+
flavors = flavor.split(',')
|
140
|
+
flavors.each do |f|
|
141
|
+
Rake::Task["ci:#{f}:execute"].invoke(mocked)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
desc 'Run mock tests'
|
146
|
+
task :run_mocks, [:flavor] do |_, args|
|
147
|
+
check_env
|
148
|
+
Rake::Task["ci:run"].invoke(args[:flavor], true)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
task default: ['lint', 'ci:run']
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: datadog-sdk-testing
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jaime Fullaondo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-16 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Datadog Integration SDK testing/scaffolding gem
|
14
|
+
email: jaime.fullaondo@datadoghq.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- LICENSE
|
20
|
+
- README.md
|
21
|
+
- lib/config/README.md
|
22
|
+
- lib/config/check.py
|
23
|
+
- lib/config/ci/skeleton.rake
|
24
|
+
- lib/config/conf.yaml.example
|
25
|
+
- lib/config/manifest.json
|
26
|
+
- lib/config/metadata.csv
|
27
|
+
- lib/config/requirements.txt
|
28
|
+
- lib/config/test_skeleton.py
|
29
|
+
- lib/tasks/ci/common.rb
|
30
|
+
- lib/tasks/ci/default.rb
|
31
|
+
- lib/tasks/ci/hooks/pre-commit.py
|
32
|
+
- lib/tasks/sdk.rake
|
33
|
+
homepage: http://rubygems.org/gems/datadog-sdk-testing
|
34
|
+
licenses:
|
35
|
+
- MIT
|
36
|
+
metadata: {}
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib/tasks/
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
requirements: []
|
52
|
+
rubyforge_project:
|
53
|
+
rubygems_version: 2.4.6
|
54
|
+
signing_key:
|
55
|
+
specification_version: 4
|
56
|
+
summary: Datadog Integration SDK testing/scaffolding facilities.
|
57
|
+
test_files: []
|