oci-logging-analytics-kubernetes-discovery 1.0.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/.gitignore +40 -0
- data/.travis.yml +6 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +36 -0
- data/README.md +83 -0
- data/Rakefile +15 -0
- data/bin/console +17 -0
- data/bin/oci-loganalytics-kubernetes-discovery +184 -0
- data/bin/setup +12 -0
- data/lib/config/oci_client_retry_config.rb +34 -0
- data/lib/discover/infrastructure.rb +122 -0
- data/lib/discover/object.rb +347 -0
- data/lib/dto/infra/cluster_entity_payload.rb +22 -0
- data/lib/dto/infra/load_balancers_entity_payload.rb +22 -0
- data/lib/dto/infra/node_pool_entity_payload.rb +24 -0
- data/lib/dto/infra/subnet_entity_payload.rb +22 -0
- data/lib/dto/infra/vcn_entity_payload.rb +22 -0
- data/lib/dto/infra_objects_payload.rb +40 -0
- data/lib/dto/kubernetes_objects_payload.rb +58 -0
- data/lib/dto/payload/log_events.rb +26 -0
- data/lib/dto/payload/log_events_json.rb +22 -0
- data/lib/dto/state.rb +19 -0
- data/lib/enum/auth_type_enum.rb +9 -0
- data/lib/enum/infrastructure_resource_discovery.rb +9 -0
- data/lib/enum/kubernetes_objects_enum.rb +22 -0
- data/lib/enum/object_client_mapping_enum.rb +21 -0
- data/lib/infra_resources.rb +91 -0
- data/lib/objects_resources.rb +174 -0
- data/lib/oci_loganalytics_resources_discovery.rb +293 -0
- data/lib/util/kube_client.rb +141 -0
- data/lib/util/kubectl_ops.rb +229 -0
- data/lib/util/log_analytics.rb +154 -0
- data/lib/util/logging.rb +96 -0
- data/lib/util/oci_clients.rb +228 -0
- data/lib/util/state_manager.rb +61 -0
- data/lib/util/string_utils.rb +16 -0
- data/lib/version.rb +6 -0
- data/oci-logging-analytics-kubernetes-discovery.gemspec +45 -0
- metadata +324 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 91e5befbfc8bd2e885d9965cc8dcf9fcf52d8efb
|
4
|
+
data.tar.gz: f54c28695b070ad4566cfe0320f713fd71a1ed30
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7122da1196e19892247ed00fe61a14490b9cc43c1a4a810c76275ec808978fc7db40281b2b5b0312af10bf616f11a8abb60fdc20fa1e044973d784a46a44dd56
|
7
|
+
data.tar.gz: 353ad156e28982d160fb8b977b064de2768ef024409d893cfe79df6dbb8ca40c93db4d2a43d72143620b6d22227dcca2d72a6326c2aa18b09c55bfe8012d4852
|
data/.gitignore
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
### Project Binaries ###
|
2
|
+
/.bundle/
|
3
|
+
/.yardoc
|
4
|
+
/_yardoc/
|
5
|
+
/coverage/
|
6
|
+
/doc/
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
9
|
+
/tmp/
|
10
|
+
|
11
|
+
### Ruby ###
|
12
|
+
.rspec_status
|
13
|
+
|
14
|
+
### IntelliJ IDEA ###
|
15
|
+
.idea
|
16
|
+
*.iws
|
17
|
+
*.iml
|
18
|
+
*.ipr
|
19
|
+
out/
|
20
|
+
!**/src/main/**/out/
|
21
|
+
!**/src/test/**/out/
|
22
|
+
|
23
|
+
### NetBeans ###
|
24
|
+
/nbproject/private/
|
25
|
+
/nbbuild/
|
26
|
+
/dist/
|
27
|
+
/nbdist/
|
28
|
+
/.nb-gradle/
|
29
|
+
|
30
|
+
### VS Code ###
|
31
|
+
.vscode/
|
32
|
+
|
33
|
+
### Development Test scripts ###
|
34
|
+
test-run*.sh
|
35
|
+
|
36
|
+
### Gems ###
|
37
|
+
*.gem
|
38
|
+
|
39
|
+
### Data files ###
|
40
|
+
*.dat
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
## Copyright (c) 2024 Oracle and/or its affiliates.
|
2
|
+
## The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
3
|
+
|
4
|
+
source 'https://rubygems.org'
|
5
|
+
|
6
|
+
# Specify your gem's dependencies in oci-logging-analytics-kubernetes-discovery.gemspec
|
7
|
+
gemspec
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
Copyright (c) 2024 Oracle and/or its affiliates.
|
2
|
+
|
3
|
+
The Universal Permissive License (UPL), Version 1.0
|
4
|
+
|
5
|
+
Subject to the condition set forth below, permission is hereby granted to any
|
6
|
+
person obtaining a copy of this software, associated documentation and/or data
|
7
|
+
(collectively the "Software"), free of charge and under any and all copyright
|
8
|
+
rights in the Software, and any and all patent rights owned or freely
|
9
|
+
licensable by each licensor hereunder covering either (i) the unmodified
|
10
|
+
Software as contributed to or provided by such licensor, or (ii) the Larger
|
11
|
+
Works (as defined below), to deal in both
|
12
|
+
|
13
|
+
(a) the Software, and
|
14
|
+
(b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
|
15
|
+
one is included with the Software (each a "Larger Work" to which the Software
|
16
|
+
is contributed by such licensors),
|
17
|
+
|
18
|
+
without restriction, including without limitation the rights to copy, create
|
19
|
+
derivative works of, display, perform, and distribute the Software and make,
|
20
|
+
use, sell, offer for sale, import, export, have made, and have sold the
|
21
|
+
Software and the Larger Work(s), and to sublicense the foregoing rights on
|
22
|
+
either these or other terms.
|
23
|
+
|
24
|
+
This license is subject to the following condition:
|
25
|
+
|
26
|
+
The above copyright notice and either this complete permission notice or at
|
27
|
+
a minimum a reference to the UPL must be included in all copies or
|
28
|
+
substantial portions of the Software.
|
29
|
+
|
30
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
31
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
32
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
33
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
34
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
35
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
36
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# OCI Logging Analytics Kubernetes Discovery
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
A rubygem for discovering Kubernetes resources and send it to OCI Logging Analytics.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'oci-logging-analytics-kubernetes-discovery'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
```shell
|
18
|
+
$ bundle install
|
19
|
+
```
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
$ gem install oci-logging-analytics-kubernetes-discovery
|
25
|
+
```
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
```
|
30
|
+
Usage: oci-loganalytics-kubernetes-discovery [options]
|
31
|
+
--oci_la_namespace OCI_LA_NAMESPACE
|
32
|
+
OCI Tenancy Namespace to which the collected log data is to be uploaded
|
33
|
+
--oci_la_log_group_id OCI_LA_LOG_GROUP_ID
|
34
|
+
OCID of Logging Analytics Log Group to which the uploaded data is to be associated with
|
35
|
+
--oci_la_cluster_entity_id KUBERNETES_CLUSTER_ENTITY_ID
|
36
|
+
OCID of Logging Analytics Kubernetes Cluster entity
|
37
|
+
--kubernetes_cluster_name KUBERNETES_CLUSTER_NAME
|
38
|
+
A unique name for each kubernetes cluster must be provided
|
39
|
+
--kubernetes_cluster_namespace KUBERNETES_CLUSTER_NAMESPACE
|
40
|
+
Kubernetes namespace in which the discovery job is configured
|
41
|
+
--kubernetes_resourcename_prefix PREFIX
|
42
|
+
Kubernetes cluster resourcename prefix. Defaults to oci-onm
|
43
|
+
--kubernetes_cluster_id KUBERNETES_CLUSTER_ID
|
44
|
+
Unique identifier for Kubernetes cluster
|
45
|
+
--endpoint ENDPOINT Logging Analytics Ingestion API endpoint to ingest your application logs
|
46
|
+
--profile_name PROFILE_NAME OCI Config Profile Name to be used from the configuration file
|
47
|
+
--config_file_location CONFIG_FILE_LOCATION
|
48
|
+
The location of the configuration file containing OCI authentication details
|
49
|
+
--kube_config_location KUBE_CONFIG_LOCATION
|
50
|
+
Path to the kubernetes configuration (kubeconfig) file
|
51
|
+
--kubernetes_url KUBERNETES_URL
|
52
|
+
Kubernetes API server URL. Alternatively, environment variables KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT can be used
|
53
|
+
--client_cert CLIENT_CERT Path to certificate file for Kubernetes HTTPs/SSL server certificate validation
|
54
|
+
--client_key CLIENT_KEY Path to key for Kubernetes HTTPs/SSL server certificate validation
|
55
|
+
--ca_file CA_FILE Path to CA file for Kubernetes HTTPs/SSL server certificate validation
|
56
|
+
--verify_ssl Validate SSL certificates while creating kube clients
|
57
|
+
--bearer_token_file BEARER_TOKEN_FILE
|
58
|
+
Path to bearer token file if basic authentication is used
|
59
|
+
--secret_dir SECRET_DIR Path to Kubernetes service account token file to access Kubernetes API
|
60
|
+
--discovery DISCOVERY_MODE Discovery mode to be used: {infra|object}
|
61
|
+
--chunk_limit CHUNK_SIZE Max number of objects that can be fetched via K8s GET API call. Default: 1000
|
62
|
+
--skip_upload Flag to skip uploading data to OCI Logging Analytics [ONLY FOR INTERNAL TESTING]
|
63
|
+
--collect_warning_events_only
|
64
|
+
Flag to collect only warning event logs
|
65
|
+
--log_format LOG_FORMAT Log format to be used: {text|json}
|
66
|
+
--log_level LOG_LEVEL User defined log level: {trace|debug|info|warn|error|fatal}
|
67
|
+
--enable_threading Defaults to sequential execution when parameter is not provided
|
68
|
+
--thread_count THREAD_COUNT Number of parallel threads to be used while making requests to API server
|
69
|
+
--enable_raw_request If set, signs the raw request while uploading payloads to Discovery API. The default behavior is to use OCI Ruby SDK
|
70
|
+
--help Print complete help information and exit
|
71
|
+
```
|
72
|
+
|
73
|
+
## License
|
74
|
+
|
75
|
+
Copyright (c) 2024 Oracle and/or its affiliates.
|
76
|
+
|
77
|
+
The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/.
|
78
|
+
|
79
|
+
See [LICENSE](LICENSE.txt) for more details.
|
80
|
+
|
81
|
+
## Re-distribution Note
|
82
|
+
|
83
|
+
If you need to re-distribute this as part of any other binary, you may need to ensure including all the necessary [runtime dependencies](oci-logging-analytics-kubernetes-discovery.gemspec) along with their transitive dependencies. Also, you may need to take care of the necessary attributions as required.
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
## Copyright (c) 2024 Oracle and/or its affiliates.
|
2
|
+
## The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
3
|
+
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
Rake::TestTask.new do |t|
|
7
|
+
# Adds the tests directory to the lists of directories in the #$LOADPATH
|
8
|
+
t.libs << 'tests'
|
9
|
+
|
10
|
+
# Creates a list of files that match 'test/*_test.rb'
|
11
|
+
t.test_files = FileList['test/*_test.rb']
|
12
|
+
|
13
|
+
# If you want your tests to output what they should do, then set this to true.
|
14
|
+
t.verbose = true
|
15
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
## Copyright (c) 2024 Oracle and/or its affiliates.
|
4
|
+
## The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
5
|
+
|
6
|
+
require 'bundler/setup'
|
7
|
+
require 'oci-logging-analytics-kubernetes-discovery'
|
8
|
+
|
9
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
10
|
+
# with your gem easier. You can also use a different console, if you like.
|
11
|
+
|
12
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
13
|
+
# require "pry"
|
14
|
+
# Pry.start
|
15
|
+
|
16
|
+
require 'irb'
|
17
|
+
IRB.start(__FILE__)
|
@@ -0,0 +1,184 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
## Copyright (c) 2024 Oracle and/or its affiliates.
|
4
|
+
## The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
5
|
+
|
6
|
+
require 'optparse'
|
7
|
+
|
8
|
+
require_relative '../lib/oci_loganalytics_resources_discovery'
|
9
|
+
require_relative '../lib/util/logging'
|
10
|
+
require_relative '../lib/util/string_utils'
|
11
|
+
|
12
|
+
extend Util::Logging
|
13
|
+
extend Util::StringUtils
|
14
|
+
|
15
|
+
cluster_config = {}
|
16
|
+
auth_config = {}
|
17
|
+
kube_config = {}
|
18
|
+
app_config = {}
|
19
|
+
|
20
|
+
DISCOVERY_OPTIONS = %w[infra object].freeze
|
21
|
+
LOG_FMT_OPTIONS = %w[text json].freeze
|
22
|
+
CHUNK_LIMIT_DEFAULT = 1000
|
23
|
+
|
24
|
+
optparse = OptionParser.new do |param|
|
25
|
+
# TODO: Naming of the gem and command.
|
26
|
+
param.banner = "\nUsage: oci-loganalytics-kubernetes-discovery [options]"
|
27
|
+
|
28
|
+
# Mandatory Fields
|
29
|
+
param.on('--oci_la_namespace OCI_LA_NAMESPACE', 'OCI Tenancy Namespace to which the collected log data is to be uploaded') { |o| cluster_config[:oci_la_namespace] = o }
|
30
|
+
param.on('--oci_la_log_group_id OCI_LA_LOG_GROUP_ID', 'OCID of Logging Analytics Log Group to which the uploaded data is to be associated with') { |o| cluster_config[:oci_la_log_group_id] = o }
|
31
|
+
param.on('--oci_la_cluster_entity_id KUBERNETES_CLUSTER_ENTITY_ID', 'OCID of Logging Analytics Kubernetes Cluster entity') { |o| cluster_config[:oci_la_cluster_entity_id] = o }
|
32
|
+
param.on('--kubernetes_cluster_name KUBERNETES_CLUSTER_NAME', 'A unique name for each kubernetes cluster must be provided') { |o| cluster_config[:kubernetes_cluster_name] = o }
|
33
|
+
param.on('--kubernetes_cluster_namespace KUBERNETES_CLUSTER_NAMESPACE', 'Kubernetes namespace in which the discovery job is configured') { |o| cluster_config[:kubernetes_cluster_namespace] = o }
|
34
|
+
param.on('--kubernetes_resourcename_prefix PREFIX', 'Kubernetes cluster resourcename prefix. Defaults to oci-onm') { |o| cluster_config[:kubernetes_resourcename_prefix] = o }
|
35
|
+
param.on('--kubernetes_cluster_id KUBERNETES_CLUSTER_ID', 'Unique identifier for Kubernetes cluster') { |o| cluster_config[:kubernetes_cluster_id] = o }
|
36
|
+
|
37
|
+
# OCI Config-based Auth
|
38
|
+
param.on('--endpoint ENDPOINT', 'Logging Analytics Ingestion API endpoint to ingest your application logs') { |o| auth_config[:endpoint] = o }
|
39
|
+
param.on('--profile_name PROFILE_NAME', 'OCI Config Profile Name to be used from the configuration file') { |o| auth_config[:profile_name] = o }
|
40
|
+
param.on('--config_file_location CONFIG_FILE_LOCATION', 'The location of the configuration file containing OCI authentication details') { |o| auth_config[:config_file_location] = o }
|
41
|
+
|
42
|
+
# Kubernetes Cluster
|
43
|
+
# For AuthNAuth when the job is outside the cluster.
|
44
|
+
param.on('--kube_config_location KUBE_CONFIG_LOCATION', 'Path to the kubernetes configuration (kubeconfig) file') { |o| kube_config[:kube_config_location] = o }
|
45
|
+
param.on('--kubernetes_url KUBERNETES_URL', 'Kubernetes API server URL. Alternatively, environment variables KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT can be used') { |o| kube_config[:kubernetes_url] = o }
|
46
|
+
# For AuthNAuth when the job is within the same cluster.
|
47
|
+
param.on('--client_cert CLIENT_CERT', 'Path to certificate file for Kubernetes HTTPs/SSL server certificate validation') { |o| kube_config[:client_cert] = o }
|
48
|
+
param.on('--client_key CLIENT_KEY', 'Path to key for Kubernetes HTTPs/SSL server certificate validation') { |o| kube_config[:client_key] = o }
|
49
|
+
param.on('--ca_file CA_FILE', 'Path to CA file for Kubernetes HTTPs/SSL server certificate validation') { |o| kube_config[:ca_file] = o }
|
50
|
+
param.on('--verify_ssl', 'Validate SSL certificates while creating kube clients') { |_o| kube_config[:verify_ssl] = true }
|
51
|
+
# For AuthNAuth using bearer token.
|
52
|
+
param.on('--bearer_token_file BEARER_TOKEN_FILE', 'Path to bearer token file if basic authentication is used') { |o| kube_config[:bearer_token_file] = o }
|
53
|
+
param.on('--secret_dir SECRET_DIR', 'Path to Kubernetes service account token file to access Kubernetes API') { |o| kube_config[:secret_dir] = o }
|
54
|
+
|
55
|
+
# Discovery
|
56
|
+
param.on('--discovery DISCOVERY_MODE', "Discovery mode to be used: #{format_option_selections(DISCOVERY_OPTIONS)}") { |o| app_config[:mode] = o.downcase }
|
57
|
+
param.on('--chunk_limit CHUNK_SIZE', Integer, "Max number of objects that can be fetched via K8s GET API call. Default: #{CHUNK_LIMIT_DEFAULT}") { |o| app_config[:chunk_limit] = o }
|
58
|
+
param.on('--skip_upload', 'Flag to skip uploading data to OCI Logging Analytics [ONLY FOR INTERNAL TESTING]') { |_o| app_config[:skip_upload] = true }
|
59
|
+
param.on('--collect_warning_events_only', 'Flag to collect only warning event logs') { |_o| app_config[:collect_warning_events_only] = true }
|
60
|
+
|
61
|
+
# Logging and threading
|
62
|
+
param.on('--log_format LOG_FORMAT', "Log format to be used: #{format_option_selections(LOG_FMT_OPTIONS)}") { |o| app_config[:log_format] = o }
|
63
|
+
param.on('--log_level LOG_LEVEL', "User defined log level: #{format_option_selections(Util::Logging::SEV_LABEL.values)}") { |o| app_config[:log_level] = o }
|
64
|
+
param.on('--enable_threading', 'Defaults to sequential execution when parameter is not provided') { |o| app_config[:enable_threading] = o }
|
65
|
+
param.on('--thread_count THREAD_COUNT', Integer, 'Number of parallel threads to be used while making requests to API server') { |o| app_config[:thread_count] = o }
|
66
|
+
param.on('--enable_raw_request', 'If set, signs the raw request while uploading payloads to Discovery API. The default behavior is to use OCI Ruby SDK') { |o| app_config[:enable_raw_request] = o }
|
67
|
+
|
68
|
+
param.on('--help', 'Print complete help information and exit') do
|
69
|
+
puts param
|
70
|
+
exit
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Initial logging configs (format is 'text', level is 'info').
|
75
|
+
Util::Logging::LogConfigs.new(LOG_FMT_OPTIONS.first, Logger::INFO)
|
76
|
+
|
77
|
+
# Argument Validations
|
78
|
+
begin
|
79
|
+
optparse.parse!
|
80
|
+
|
81
|
+
# Check if mandatory arguments are missing.
|
82
|
+
mandatory = %i[oci_la_namespace oci_la_log_group_id kubernetes_cluster_id kubernetes_cluster_name kubernetes_cluster_namespace]
|
83
|
+
missing = mandatory.select { |param| cluster_config[param].nil? || cluster_config[param].empty? } # .empty gates 'key=' edge case
|
84
|
+
raise OptionParser::MissingArgument, missing.join(', ') unless missing.empty?
|
85
|
+
|
86
|
+
# Valid discovery mode check.
|
87
|
+
unless app_config[:mode].nil?
|
88
|
+
unless DISCOVERY_OPTIONS.include? app_config[:mode]
|
89
|
+
raise OptionParser::InvalidOption, "--discovery=#{app_config[:mode]}"
|
90
|
+
end
|
91
|
+
|
92
|
+
# Threads valid only for object discovery (not for infrastrucutre discovery).
|
93
|
+
if app_config[:mode] == DISCOVERY_OPTIONS.first && app_config[:enable_threading]
|
94
|
+
logger.info("Multi-threading is only supported for mode: #{DISCOVERY_OPTIONS.second}")
|
95
|
+
raise OptionParser::InvalidOption, '--enable_threading'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# If threads are enabled, thread count and queue size should be provided as arguments.
|
100
|
+
if app_config[:enable_threading] && app_config[:thread_count].nil?
|
101
|
+
raise OptionParser::MissingArgument, '--thread_count'
|
102
|
+
end
|
103
|
+
|
104
|
+
if app_config[:chunk_limit] && app_config[:chunk_limit] > 10_000
|
105
|
+
raise OptionParser::InvalidOption, '--chunk_limit is too large.'
|
106
|
+
end
|
107
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
|
108
|
+
logger.info(e.to_s.capitalize)
|
109
|
+
logger.info(optparse)
|
110
|
+
exit(1)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Set defaults for skipped inputs
|
114
|
+
|
115
|
+
cluster_config[:kubernetes_cluster_id] = cluster_config[:kubernetes_cluster_id] ||= nil
|
116
|
+
cluster_config[:oci_la_cluster_entity_id] = cluster_config[:oci_la_cluster_entity_id] ||= nil
|
117
|
+
cluster_config[:kubernetes_resourcename_prefix] = cluster_config[:kubernetes_resourcename_prefix] ||= 'oci-onm'
|
118
|
+
|
119
|
+
# Config based auth
|
120
|
+
auth_config[:endpoint] = auth_config[:endpoint] ||= nil
|
121
|
+
auth_config[:profile_name] = auth_config[:profile_name] ||= 'DEFAULT'
|
122
|
+
auth_config[:config_file_location] = auth_config[:config_file_location] ||= nil
|
123
|
+
|
124
|
+
# Kubernetes cluster related
|
125
|
+
kube_config[:kube_config_location] = kube_config[:kube_config_location] ||= nil
|
126
|
+
kube_config[:kubernetes_url] = kube_config[:kubernetes_url] ||= nil
|
127
|
+
kube_config[:api_endpoint] = kube_config[:api_endpoint] ||= 'api'
|
128
|
+
kube_config[:api_version] = kube_config[:api_version] ||= 'v1'
|
129
|
+
kube_config[:client_cert] = kube_config[:client_cert] ||= nil
|
130
|
+
kube_config[:client_key] = kube_config[:client_key] ||= nil
|
131
|
+
kube_config[:ca_file] = kube_config[:ca_file] ||= nil
|
132
|
+
kube_config[:verify_ssl] = kube_config[:verify_ssl] ||= false
|
133
|
+
kube_config[:bearer_token_file] = kube_config[:bearer_token_file] ||= nil
|
134
|
+
kube_config[:secret_dir] = kube_config[:secret_dir] ||= '/var/run/secrets/kubernetes.io/serviceaccount'
|
135
|
+
|
136
|
+
# Discovery
|
137
|
+
app_config[:mode] = app_config[:mode] ||= 'object'
|
138
|
+
app_config[:skip_upload] = app_config[:skip_upload] ||= false
|
139
|
+
app_config[:collect_warning_events_only] = app_config[:collect_warning_events_only] ||= false
|
140
|
+
app_config[:chunk_limit] = app_config[:chunk_limit] ||= CHUNK_LIMIT_DEFAULT
|
141
|
+
|
142
|
+
# Threading
|
143
|
+
app_config[:enable_threading] = app_config[:enable_threading] ||= false
|
144
|
+
app_config[:thread_count] = app_config[:thread_count] ||= 1
|
145
|
+
app_config[:work_queue_size] = app_config[:work_queue_size] ||= (app_config[:thread_count] * 5)
|
146
|
+
|
147
|
+
# Log level and format provided in arguement
|
148
|
+
app_config[:log_format] = app_config[:log_format] ||= LOG_FMT_OPTIONS.first
|
149
|
+
app_config[:log_level] = !app_config[:log_level].nil? ? Util::Logging::SEV_LABEL.key(app_config[:log_level].upcase) : Logger::INFO
|
150
|
+
app_config[:enable_raw_request] = app_config[:enable_raw_request] ||= false
|
151
|
+
|
152
|
+
Util::Logging::LogConfigs.new(app_config[:log_format], app_config[:log_level])
|
153
|
+
|
154
|
+
logger.info('Initiating Kubernetes Discovery.')
|
155
|
+
|
156
|
+
begin
|
157
|
+
# Initializing required clients.
|
158
|
+
OciLogAnalyticsResourcesDiscovery.initialize(
|
159
|
+
cluster_config_hash: cluster_config,
|
160
|
+
auth_config_hash: auth_config,
|
161
|
+
kube_config_hash: kube_config,
|
162
|
+
app_config_hash: app_config
|
163
|
+
)
|
164
|
+
|
165
|
+
case app_config[:mode]
|
166
|
+
when 'infra'
|
167
|
+
# Initiating Kubernetes infrastructure discovery
|
168
|
+
OciLogAnalyticsResourcesDiscovery.initiate_infra_discovery
|
169
|
+
when 'object'
|
170
|
+
# Initiating Kubernetes objects discovery
|
171
|
+
OciLogAnalyticsResourcesDiscovery.initiate_object_discovery
|
172
|
+
end
|
173
|
+
rescue StandardError => e
|
174
|
+
unless e.backtrace.empty?
|
175
|
+
stack_trace = "\n"
|
176
|
+
e.backtrace.each { |line| stack_trace += "#{line}\n" }
|
177
|
+
logger.error("Stack trace - #{stack_trace.rstrip}")
|
178
|
+
end
|
179
|
+
logger.error('Kubernetes discovery failed.')
|
180
|
+
exit(1)
|
181
|
+
end
|
182
|
+
|
183
|
+
logger.info('Kubernetes discovery is successfully completed.')
|
184
|
+
exit(0)
|
data/bin/setup
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
## Copyright (c) 2024 Oracle and/or its affiliates.
|
4
|
+
## The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
5
|
+
|
6
|
+
set -euo pipefail
|
7
|
+
IFS=$'\n\t'
|
8
|
+
set -vx
|
9
|
+
|
10
|
+
bundle install
|
11
|
+
|
12
|
+
# Do any other automated setup that you need to do here
|
@@ -0,0 +1,34 @@
|
|
1
|
+
## Copyright (c) 2024 Oracle and/or its affiliates.
|
2
|
+
## The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
3
|
+
|
4
|
+
require_relative '../util/logging'
|
5
|
+
|
6
|
+
module Config
|
7
|
+
module OCIClientRetryConfig
|
8
|
+
extend Util::Logging
|
9
|
+
|
10
|
+
module_function
|
11
|
+
|
12
|
+
attr_accessor :retry_config
|
13
|
+
|
14
|
+
def set_default_retry_config
|
15
|
+
OCI::Retry::RetryConfig.new(
|
16
|
+
base_sleep_time_millis: 1000,
|
17
|
+
exponential_growth_factor: 2,
|
18
|
+
should_retry_exception_proc: OCI::Retry::Functions::ShouldRetryOnError.retry_on_network_error_throttle_and_internal_server_errors,
|
19
|
+
sleep_calc_millis_proc: OCI::Retry::Functions::Sleep.exponential_backoff_with_full_jitter,
|
20
|
+
max_attempts: 5,
|
21
|
+
max_elapsed_time_millis: 300_000, # 5 minutes
|
22
|
+
max_sleep_between_attempts_millis: 10_000
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_custom_retry_config(custom_retry_config)
|
27
|
+
@retry_config = custom_retry_config
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_retry_config
|
31
|
+
@retry_config.nil? ? set_default_retry_config : @retry_config
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
## Copyright (c) 2024 Oracle and/or its affiliates.
|
2
|
+
## The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
3
|
+
|
4
|
+
require_relative '../util/logging'
|
5
|
+
|
6
|
+
# Util
|
7
|
+
require_relative '../util/oci_clients'
|
8
|
+
|
9
|
+
module Discover
|
10
|
+
module Infrastructure
|
11
|
+
extend Util::Logging
|
12
|
+
extend Util::OCIClients
|
13
|
+
|
14
|
+
module_function
|
15
|
+
|
16
|
+
def fetch_cluster_details(_auth_object, cluster_id)
|
17
|
+
client = nil
|
18
|
+
begin
|
19
|
+
client = Util::OCIClients.get_clients[:ce_client]
|
20
|
+
response = client.get_cluster(cluster_id)
|
21
|
+
|
22
|
+
@cluster_details = response.data
|
23
|
+
rescue StandardError => e
|
24
|
+
logger.error("Error while discovering cluster details: #{e}")
|
25
|
+
raise StandardError, 'Error while discovering cluster details.'
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
@cluster_details
|
29
|
+
end
|
30
|
+
|
31
|
+
def fetch_node_pool_lists(_auth_object, compartment_id, cluster_id)
|
32
|
+
opts = { cluster_id: cluster_id }
|
33
|
+
begin
|
34
|
+
client = Util::OCIClients.get_clients[:ce_client]
|
35
|
+
response = client.list_node_pools(compartment_id, opts)
|
36
|
+
|
37
|
+
@node_pool_list = response.data
|
38
|
+
rescue StandardError => e
|
39
|
+
logger.error("Error while discovering node pool list: #{e}")
|
40
|
+
raise StandardError, 'Error while discovering node pool list.'
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
@node_pool_list
|
44
|
+
end
|
45
|
+
|
46
|
+
def fetch_compartment_list(_auth_object, compartment_id)
|
47
|
+
client = nil
|
48
|
+
opts = { compartment_id_in_subtree: true, access_level: 'ANY' }
|
49
|
+
begin
|
50
|
+
client = Util::OCIClients.get_clients[:id_client]
|
51
|
+
response = client.list_compartments(compartment_id, opts)
|
52
|
+
|
53
|
+
@id_response = response.data
|
54
|
+
rescue StandardError => e
|
55
|
+
logger.error("Error while fetching load balancer details: #{e}")
|
56
|
+
raise StandardError, 'Error while fetching load balancer details.'
|
57
|
+
end
|
58
|
+
@id_response
|
59
|
+
end
|
60
|
+
|
61
|
+
def fetch_load_balancer_details(_auth_object, load_balancer_id)
|
62
|
+
client = nil
|
63
|
+
begin
|
64
|
+
client = Util::OCIClients.get_clients[:lb_client]
|
65
|
+
response = client.get_load_balancer(load_balancer_id)
|
66
|
+
@lb_response = response.data
|
67
|
+
rescue StandardError => e
|
68
|
+
logger.error("Error while fetching load balancer details: #{e}")
|
69
|
+
raise StandardError, 'Error while fetching load balancer details.'
|
70
|
+
end
|
71
|
+
@lb_response
|
72
|
+
end
|
73
|
+
|
74
|
+
def fetch_free_text_details(_auth_object, cluster_id)
|
75
|
+
client = nil
|
76
|
+
begin
|
77
|
+
client = Util::OCIClients.get_clients[:rs_client]
|
78
|
+
response = client.search_resources(
|
79
|
+
OCI::ResourceSearch::Models::FreeTextSearchDetails.new(
|
80
|
+
type: 'FreeText',
|
81
|
+
text: cluster_id,
|
82
|
+
matchingContextType: 'HIGHLIGHTS'
|
83
|
+
)
|
84
|
+
)
|
85
|
+
@free_text_response = response.data
|
86
|
+
rescue StandardError => e
|
87
|
+
logger.error("Error while fetching free text details: #{e}")
|
88
|
+
raise StandardError, 'Error while fetching free text details.'
|
89
|
+
end
|
90
|
+
@free_text_response
|
91
|
+
end
|
92
|
+
|
93
|
+
def fetch_vcn_response(_auth_object, vcn_id)
|
94
|
+
client = nil
|
95
|
+
begin
|
96
|
+
client = Util::OCIClients.get_clients[:vnc_client]
|
97
|
+
response = client.get_vcn(vcn_id)
|
98
|
+
|
99
|
+
@vnc_response = response.data
|
100
|
+
rescue StandardError => e
|
101
|
+
logger.error("Error while discovering VNC details: #{e}")
|
102
|
+
raise StandardError, 'Error while discovering VNC details.'
|
103
|
+
end
|
104
|
+
@vnc_response
|
105
|
+
end
|
106
|
+
|
107
|
+
def fetch_subnet_list_response(_auth_object, compartment_id, vcn_id)
|
108
|
+
client = nil
|
109
|
+
begin
|
110
|
+
opts = { vcn_id: vcn_id }
|
111
|
+
client = Util::OCIClients.get_clients[:vnc_client]
|
112
|
+
response = client.list_subnets(compartment_id, opts)
|
113
|
+
|
114
|
+
@subnet_response = response.data
|
115
|
+
rescue StandardError => e
|
116
|
+
logger.error("Error while discovering subnet details: #{e}")
|
117
|
+
raise StandardError, 'Error while discovering subnet details.'
|
118
|
+
end
|
119
|
+
@subnet_response
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|