rubernetes 0.0.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21923c93407c1f5c79963abcb1eaa4ef89c52ee46111c46579659b90f652cf3f
4
- data.tar.gz: '029603f65206d80f14135991480d115275f982b4765e9ed59b0a3144d5a4a326'
3
+ metadata.gz: 0ffa9c6204defe6efe0a4b2dcdb5e1afaf065228956462f06c9326a5cab8fa1d
4
+ data.tar.gz: 75b414dbcedb55979bc6da8c31cce0102dd6aa155b647800c5176084b2486cce
5
5
  SHA512:
6
- metadata.gz: af29dcfdc6f078a2a575d5e1ab1c5bd68d8947883b334c39b7e037a45fb21ee8105f0593d502d1e26ea08d8d9832c684725a00f1e17c2fbc098370217a5388b2
7
- data.tar.gz: e2886d8de738d36c5d46c4a4f09ebcf0d2278d669b7e5f53df5a19c1c56d9fc991ede33013ea4741489266d232401070c0e642bd0e00f7c08ae7014cb69dd2c2
6
+ metadata.gz: eb4575fcfdcb9fe359e18697dfa79addffb4a770ef6953bda7ef4f322901c4f4f798fe9077e5777c0d2318378e0414a47fd5e66877a225baa8dc8a1154af36b3
7
+ data.tar.gz: d618b67d3095a6e8f4bcbc383bd7e5f66c26b6dd80ed4b83df8f9e31f5fa4a00c134ad2867932c6cf592d02c3b76e274791df51e0da8a3da06619e780c5e083a
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
- # Rubernetes
2
- A ruby gem to provide the base for building Kubernetes custom resources controllers in Ruby.
1
+ # <span style="color:blue">Rub</span><span style="color:red">ernetes</span>
2
+ A ruby gem to provide the base for building Kubernetes custom resources operators in Ruby.
3
+
4
+ ![logo](./assets/logo.gif)
3
5
 
4
6
  ## Installation
5
7
 
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rubernetes
4
+ module Auth
5
+ # This class is used to read and parse a KUBECONFIG file.
6
+ # It will try to read the KUBECONFIG from ENV first, otherwise it will fallback to ~/.kube/config.
7
+ # It extracts the kube API endpoint and authentication details.
8
+ class KubeConfig
9
+ KUBECONFIG_DEFAULT_PATH = "#{Dir.home}/.kube/config"
10
+
11
+ def initialize
12
+ config_path = ENV.fetch('KUBECONFIG', KUBECONFIG_DEFAULT_PATH)
13
+ config = Kubeclient::Config.read(config_path)
14
+ @context = config.context
15
+ end
16
+
17
+ def api_endpoint
18
+ @context.api_endpoint
19
+ end
20
+
21
+ def ssl_options
22
+ @context.ssl_options
23
+ end
24
+
25
+ def auth_options
26
+ @context.auth_options
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rubernetes
4
+ module Auth
5
+ # This class is used as a serviceaccount's crt/token options wrapper.
6
+ # It assumes that the serviceaccount crt/token is mounted at
7
+ # `/var/run/secrets/kubernetes.io/serviceaccount`.
8
+ class ServiceAccount
9
+ CRT_PATH = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
10
+ TOKEN_PATH = '/var/run/secrets/kubernetes.io/serviceaccount/token'
11
+
12
+ def initialize; end
13
+
14
+ def api_endpoint
15
+ @api_endpoint ||= "#{ssl_options.empty? ? 'http' : 'https'}://kubernetes.default.svc"
16
+ end
17
+
18
+ def ssl_options
19
+ @ssl_options ||= if File.exist?(CRT_PATH)
20
+ { ca_file: CRT_PATH }
21
+ else
22
+ {}
23
+ end
24
+ end
25
+
26
+ def auth_options
27
+ @auth_options ||= {
28
+ bearer_token_file: TOKEN_PATH
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'kube_config'
4
+ require_relative 'service_account'
5
+ require 'forwardable'
6
+
7
+ module Rubernetes
8
+ module Auth
9
+ # This class is used to decide on which auth mechanism to use (service_account? vs. kube_config?).
10
+ # It helps to run Rubernetes in development/local enviornments where a serviceaccount is missing.
11
+ class Source
12
+ extend Forwardable
13
+ def_delegators :@authenticator, :api_endpoint, :ssl_options, :auth_options
14
+ attr_accessor :authenticator
15
+
16
+ def initialize
17
+ @authenticator = if service_account?
18
+ ServiceAccount.new
19
+ elsif kube_config?
20
+ KubeConfig.new
21
+ else
22
+ raise Rubernetes::MissingAuthSource, 'Could not recognize authentication source'
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def service_account?
29
+ File.exist?(ServiceAccount::TOKEN_PATH)
30
+ end
31
+
32
+ def kube_config?
33
+ File.exist?(kube_config_path)
34
+ end
35
+
36
+ def kube_config_path
37
+ ENV.fetch('KUBECONFIG', "#{Dir.home}/.kube/config")
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rubernetes
4
+ class Event
5
+ attr_reader :event, :logger, :store
6
+
7
+ def initialize(event, logger, store)
8
+ @event = event
9
+ @logger = logger
10
+ @store = store
11
+ end
12
+
13
+ def handle(event_handlers)
14
+ logger.info('event received')
15
+ logger.debug("cached?: #{cached?.to_s}")
16
+ return if cached?
17
+
18
+ event_handlers[@event[:type].downcase.to_sym].call(event)
19
+ cache!
20
+ end
21
+
22
+ private
23
+
24
+ def cached?
25
+ !store.transaction { store[cache_key] }.to_s.empty? &&
26
+ cache.to_i >= event.dig(:object, :metadata, :resourceVersion).to_i
27
+ end
28
+
29
+ def cache
30
+ store.transaction { store[cache_key] }
31
+ end
32
+
33
+ def cache!
34
+ store.transaction do
35
+ store[cache_key] = event.dig(:object, :metadata, :resourceVersion)
36
+ store.commit
37
+ end
38
+ end
39
+
40
+ def cache_key
41
+ event.dig(:object, :metadata, :uid)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'auth/source'
4
+ require 'kubeclient'
5
+
6
+ module Rubernetes
7
+ # A wrapper class around original Kubeclient https://github.com/abonas/kubeclient.
8
+ # It will automatically create a Kubeclient from
9
+ # a detected `serviceaccount` or `KUBECONFIG`
10
+ class KubeClient
11
+ KUBE_CLIENT_CLASS = ::Kubeclient::Client
12
+
13
+ def initialize(crd_group, crd_version)
14
+ @crd_group = crd_group
15
+ @crd_version = crd_version
16
+ end
17
+
18
+ def method_missing(method, *args)
19
+ auth_source = Auth::Source.new
20
+
21
+ @client ||= KUBE_CLIENT_CLASS.new(
22
+ "#{auth_source.api_endpoint}/apis/#{@crd_group}",
23
+ @crd_version,
24
+ ssl_options: auth_source.ssl_options,
25
+ auth_options: auth_source.auth_options
26
+ )
27
+
28
+ return @client.send(method, *args) if @client.respond_to?(method)
29
+
30
+ super
31
+ end
32
+
33
+ def respond_to_missing?(_method_name, _include_private = false)
34
+ super
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+ require 'forwardable'
5
+
6
+ module Rubernetes
7
+ # A wrapper class around Ruby Logger
8
+ # It will automatically attach a Rubernetes specific formatter
9
+ # which will prepend #{crd_group}/#{crd_version}/#{crd_plural}
10
+ # to all log messages
11
+ class Logger
12
+ extend Forwardable
13
+ def_delegators :@logger, :info, :debug, :error
14
+ attr_accessor :logger
15
+
16
+ def initialize(crd_group, crd_version, crd_plural, options)
17
+ original_formatter = ::Logger::Formatter.new
18
+ namespace ||= options[:namespace]
19
+ formatter = proc do |severity, datetime, progname, msg|
20
+ prefix = "#{crd_group}/#{crd_version}"
21
+ prefix += "/#{namespace}" if namespace
22
+ prefix += "/#{crd_plural}"
23
+ "#{prefix}: #{original_formatter.call(severity, datetime, progname, msg.dump)}"
24
+ end
25
+ @logger = ::Logger.new($stdout)
26
+ @logger.formatter = formatter
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'kube_client'
4
+ require_relative 'logger'
5
+ require_relative 'event'
6
+ require 'yaml'
7
+ require 'yaml/store'
8
+
9
+ module Rubernetes
10
+ # Operator Class to run the core operator functions for your crd
11
+ # @param group [string] Group from crd
12
+ # @param version [string] Api Version from crd
13
+ # @param plural [string] Name (plural) from crd
14
+ # @param options [Hash] Additional options
15
+ # @option options [Hash] sleepTimer Time to wait for retry if the watch event stops
16
+ # @option options [Hash] namespace Watch only an namespace, default watch all namespaces
17
+ # @option options [Hash] persistence_location Location for the yaml store, default is /tmp/persistence
18
+ class Operator
19
+ def initialize(crd_group, crd_version, crd_plural, options = {})
20
+ # parameters
21
+ @crd_group = crd_group
22
+ @crd_version = crd_version
23
+ @crd_plural = crd_plural
24
+
25
+ # defaults
26
+ @options = options
27
+ @options[:sleepTimer] ||= 1
28
+ @options[:namespace] ||= nil
29
+
30
+ # persistence/cache layer
31
+ @options[:persistence_location] ||= '/tmp/cache'
32
+ Dir.mkdir(@options[:persistence_location]) unless File.exist?(@options[:persistence_location])
33
+ @store = YAML::Store.new("#{@options[:persistence_location]}/#{@crd_group}_#{@crd_version}_#{@crd_plural}.yaml")
34
+
35
+ # utilities
36
+ @k8sclient = KubeClient.new(crd_group, crd_version)
37
+ @logger = Logger.new(crd_group, crd_version, crd_plural, namespace: @options[:namespace])
38
+
39
+ @logger.info('init the operator')
40
+ end
41
+
42
+ def run
43
+ @logger.info('start the operator')
44
+
45
+ loop do
46
+ begin
47
+ watcher.each do |event|
48
+ handle_event(event)
49
+ end
50
+ watcher.finish
51
+ rescue StandardError => e
52
+ @logger.error(e.inspect)
53
+ end
54
+
55
+ # do not overwhelm Kube API, relax between calls
56
+ sleep(@options[:sleepTimer])
57
+ end
58
+ end
59
+
60
+ protected
61
+ def added(event)
62
+ @logger.info('external handler(:added) called')
63
+ @logger.debug(event.inspect)
64
+ end
65
+
66
+ def modified(event)
67
+ @logger.info('external handler(:modified) called')
68
+ @logger.debug(event.inspect)
69
+ end
70
+
71
+ def deleted(event)
72
+ @logger.info('external handler(:deleted) called')
73
+ @logger.debug(event.inspect)
74
+ end
75
+
76
+ def set_status(event, patch)
77
+ name = event.dig(:object, :metadata, :name)
78
+ puts name
79
+ @k8sclient.patch_entity(@crd_plural, name, {status: patch}, 'merge-patch', @options[:namespace]) and return
80
+ end
81
+
82
+ def get_status(event)
83
+ resource_name = event.dig(:object, :metadata, :name)
84
+ @k8sclient.get_entity(@crd_plural, resource_name, @options[:namespace]).dig(:status)
85
+ end
86
+
87
+ private
88
+
89
+ def handle_event(ev)
90
+ event = Event.new(ev, @logger, @store)
91
+ handlers = {
92
+ added: method(:added),
93
+ modified: method(:modified),
94
+ deleted: method(:deleted)
95
+ }
96
+
97
+ event.handle(handlers)
98
+ end
99
+
100
+ def watcher
101
+ @watcher ||= if @options[:namespace]
102
+ @k8sclient.watch_entities(@crd_plural, namespace: @options[:namespace])
103
+ else
104
+ @k8sclient.watch_entities(@crd_plural)
105
+ end
106
+ end
107
+ end
108
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rubernetes
4
- VERSION = '0.0.0'
4
+ VERSION = '1.0.0'
5
5
  end
data/lib/rubernetes.rb CHANGED
@@ -1,7 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rubernetes/version'
3
+ require_relative 'rubernetes/version'
4
+ require_relative 'rubernetes/kube_client'
5
+ require_relative 'rubernetes/operator'
4
6
 
5
7
  module Rubernetes
6
8
  class Error < StandardError; end
9
+
10
+ class MissingAuthSource < Error; end
7
11
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubernetes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tarek N. Samni
@@ -10,8 +10,36 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-04-07 00:00:00.000000000 Z
14
- dependencies: []
13
+ date: 2023-02-28 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: kubeclient
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: logger
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
15
43
  description: A ruby gem to provide the base for building Kubernetes custom resources
16
44
  controllers in Ruby.
17
45
  email:
@@ -22,30 +50,24 @@ executables: []
22
50
  extensions: []
23
51
  extra_rdoc_files: []
24
52
  files:
25
- - ".github/workflows/main.yml"
26
- - ".github/workflows/release.yml"
27
- - ".gitignore"
28
- - ".rspec"
29
- - ".rubocop.yml"
30
- - CODE_OF_CONDUCT.md
31
- - CONTRIBUTING.md
32
- - Gemfile
33
- - Gemfile.lock
34
- - LICENSE
35
53
  - README.md
36
- - Rakefile
37
- - SECURITY.md
38
54
  - bin/console
39
55
  - bin/setup
40
56
  - lib/rubernetes.rb
57
+ - lib/rubernetes/auth/kube_config.rb
58
+ - lib/rubernetes/auth/service_account.rb
59
+ - lib/rubernetes/auth/source.rb
60
+ - lib/rubernetes/event.rb
61
+ - lib/rubernetes/kube_client.rb
62
+ - lib/rubernetes/logger.rb
63
+ - lib/rubernetes/operator.rb
41
64
  - lib/rubernetes/version.rb
42
- - rubernetes.gemspec
43
65
  homepage: https://github.com/rubernetes/gem
44
66
  licenses:
45
67
  - MIT
46
68
  metadata:
47
69
  bug_tracker_uri: https://github.com/rubernetes/gem/issues
48
- documentation_uri: https://rubydoc.info/github.com/rubernetes/gem
70
+ documentation_uri: https://rubydoc.info/github/rubernetes/gem
49
71
  homepage_uri: https://github.com/rubernetes/gem
50
72
  source_code_uri: https://github.com/rubernetes/gem
51
73
  post_install_message:
@@ -56,7 +78,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
78
  requirements:
57
79
  - - ">="
58
80
  - !ruby/object:Gem::Version
59
- version: 2.4.0
81
+ version: 2.5.0
60
82
  required_rubygems_version: !ruby/object:Gem::Requirement
61
83
  requirements:
62
84
  - - ">="
@@ -1,45 +0,0 @@
1
- name: Ruby CI
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- pull_request:
8
-
9
- jobs:
10
- test-lint:
11
-
12
- runs-on: ubuntu-latest
13
-
14
- strategy:
15
- matrix:
16
- ruby-version: ['2.4', '2.5', '2.6', '2.7', '3.0']
17
-
18
- steps:
19
- - uses: actions/checkout@v2
20
- - name: Set up Ruby
21
- uses: ruby/setup-ruby@v1
22
- with:
23
- ruby-version: ${{ matrix.ruby-version }}
24
- bundler-cache: true
25
-
26
- - name: Build
27
- run: |
28
- gem install bundler -v 2.2.8
29
- bundle install
30
-
31
- - name: Rubocop run
32
- run: |
33
- bash -c "
34
- bundle exec rubocop --require code_scanning --format CodeScanning::SarifFormatter -o ${{ matrix.ruby-version }}-rubocop.sarif
35
- [[ $? -ne 2 ]]
36
- "
37
-
38
- - name: Test with Rspec
39
- run: |
40
- bundle exec rspec
41
-
42
- - name: Upload Sarif output
43
- uses: github/codeql-action/upload-sarif@v1
44
- with:
45
- sarif_file: ${{ matrix.ruby-version }}-rubocop.sarif
@@ -1,28 +0,0 @@
1
- name: Release Gem
2
-
3
- on:
4
- release:
5
- types: [published]
6
-
7
-
8
- jobs:
9
- build:
10
- runs-on: ubuntu-latest
11
-
12
- steps:
13
- - uses: actions/checkout@v2
14
- - name: Set up Ruby
15
- uses: ruby/setup-ruby@v1
16
- with:
17
- ruby-version: 2.7.3
18
-
19
- - name: Publish to RubyGems
20
- run: |
21
- mkdir -p $HOME/.gem
22
- touch $HOME/.gem/credentials
23
- chmod 0600 $HOME/.gem/credentials
24
- printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
25
- gem build *.gemspec
26
- gem push *.gem
27
- env:
28
- GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_API_KEY}}"
data/.gitignore DELETED
@@ -1,65 +0,0 @@
1
- *.gem
2
- *.rbc
3
- /.config
4
- /coverage/
5
- /InstalledFiles
6
- /pkg/
7
- /spec/reports/
8
- /spec/examples.txt
9
- /test/tmp/
10
- /test/version_tmp/
11
- /tmp/
12
- # rspec failure tracking
13
- .rspec_status
14
-
15
- # rvm/ruby files
16
- .ruby-gemset
17
- .ruby-version
18
-
19
- # Used by dotenv library to load environment variables.
20
- # .env
21
-
22
- # Ignore Byebug command history file.
23
- .byebug_history
24
-
25
- ## Specific to RubyMotion:
26
- .dat*
27
- .repl_history
28
- build/
29
- *.bridgesupport
30
- build-iPhoneOS/
31
- build-iPhoneSimulator/
32
-
33
- ## Specific to RubyMotion (use of CocoaPods):
34
- #
35
- # We recommend against adding the Pods directory to your .gitignore. However
36
- # you should judge for yourself, the pros and cons are mentioned at:
37
- # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
38
- #
39
- # vendor/Pods/
40
-
41
- ## Documentation cache and generated files:
42
- /.yardoc/
43
- /_yardoc/
44
- /doc/
45
- /rdoc/
46
-
47
- ## Environment normalization:
48
- /.bundle/
49
- /vendor/bundle
50
- /lib/bundler/man/
51
-
52
- # for a library or gem, you might want to ignore these files since the code is
53
- # intended to run in multiple environments; otherwise, check them in:
54
- # Gemfile.lock
55
- # .ruby-version
56
- # .ruby-gemset
57
-
58
- # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
59
- .rvmrc
60
-
61
- # Used by RuboCop. Remote config files pulled in from inherit_from directive.
62
- # .rubocop-https?--*
63
-
64
- # Jetbrains
65
- .idea/
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- --require spec_helper
data/.rubocop.yml DELETED
@@ -1,67 +0,0 @@
1
- require:
2
- - rubocop-rake
3
- - rubocop-rspec
4
-
5
- AllCops:
6
- TargetRubyVersion: 2.4
7
-
8
- Gemspec/DateAssignment:
9
- Enabled: true
10
- Layout/SpaceBeforeBrackets:
11
- Enabled: true
12
- Lint/AmbiguousAssignment:
13
- Enabled: true
14
- Lint/DeprecatedConstants:
15
- Enabled: true
16
- Lint/DuplicateBranch:
17
- Enabled: true
18
- Lint/DuplicateRegexpCharacterClassElement:
19
- Enabled: true
20
- Lint/EmptyBlock:
21
- Enabled: true
22
- Lint/EmptyClass:
23
- Enabled: true
24
- Lint/LambdaWithoutLiteralBlock:
25
- Enabled: true
26
- Lint/NoReturnInBeginEndBlocks:
27
- Enabled: true
28
- Lint/NumberedParameterAssignment:
29
- Enabled: true
30
- Lint/OrAssignmentToConstant:
31
- Enabled: true
32
- Lint/RedundantDirGlobSort:
33
- Enabled: true
34
- Lint/SymbolConversion:
35
- Enabled: true
36
- Lint/ToEnumArguments:
37
- Enabled: true
38
- Lint/TripleQuotes:
39
- Enabled: true
40
- Lint/UnexpectedBlockArity:
41
- Enabled: true
42
- Lint/UnmodifiedReduceAccumulator:
43
- Enabled: true
44
- Style/ArgumentsForwarding:
45
- Enabled: true
46
- Style/CollectionCompact:
47
- Enabled: true
48
- Style/DocumentDynamicEvalDefinition:
49
- Enabled: true
50
- Style/EndlessMethod:
51
- Enabled: true
52
- Style/HashConversion:
53
- Enabled: true
54
- Style/HashExcept:
55
- Enabled: true
56
- Style/IfWithBooleanLiteralBranches:
57
- Enabled: true
58
- Style/NegatedIfElseCondition:
59
- Enabled: true
60
- Style/NilLambda:
61
- Enabled: true
62
- Style/RedundantArgument:
63
- Enabled: true
64
- Style/StringChars:
65
- Enabled: true
66
- Style/SwapValues:
67
- Enabled: true
data/CODE_OF_CONDUCT.md DELETED
@@ -1,88 +0,0 @@
1
- <!-- START doctoc generated TOC please keep comment here to allow auto update -->
2
- <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
3
- **Table of Contents**
4
-
5
- - [Contributor Covenant Code of Conduct](#contributor-covenant-code-of-conduct)
6
- - [Our Pledge](#our-pledge)
7
- - [Our Standards](#our-standards)
8
- - [Our Responsibilities](#our-responsibilities)
9
- - [Scope](#scope)
10
- - [Enforcement](#enforcement)
11
- - [Attribution](#attribution)
12
-
13
- <!-- END doctoc generated TOC please keep comment here to allow auto update -->
14
-
15
- # Contributor Covenant Code of Conduct
16
-
17
- ## Our Pledge
18
-
19
- In the interest of fostering an open and welcoming environment, we as
20
- contributors and maintainers pledge to making participation in our project and
21
- our community a harassment-free experience for everyone, regardless of age, body
22
- size, disability, ethnicity, gender identity and expression, level of experience,
23
- nationality, personal appearance, race, religion, or sexual identity and
24
- orientation.
25
-
26
- ## Our Standards
27
-
28
- Examples of behavior that contributes to creating a positive environment
29
- include:
30
-
31
- * Using welcoming and inclusive language
32
- * Being respectful of differing viewpoints and experiences
33
- * Gracefully accepting constructive criticism
34
- * Focusing on what is best for the community
35
- * Showing empathy towards other community members
36
-
37
- Examples of unacceptable behavior by participants include:
38
-
39
- * The use of sexualized language or imagery and unwelcome sexual attention or
40
- advances
41
- * Trolling, insulting/derogatory comments, and personal or political attacks
42
- * Public or private harassment
43
- * Publishing others' private information, such as a physical or electronic
44
- address, without explicit permission
45
- * Other conduct which could reasonably be considered inappropriate in a
46
- professional setting
47
-
48
- ## Our Responsibilities
49
-
50
- Project maintainers are responsible for clarifying the standards of acceptable
51
- behavior and are expected to take appropriate and fair corrective action in
52
- response to any instances of unacceptable behavior.
53
-
54
- Project maintainers have the right and responsibility to remove, edit, or
55
- reject comments, commits, code, wiki edits, issues, and other contributions
56
- that are not aligned to this Code of Conduct, or to ban temporarily or
57
- permanently any contributor for other behaviors that they deem inappropriate,
58
- threatening, offensive, or harmful.
59
-
60
- ## Scope
61
-
62
- This Code of Conduct applies both within project spaces and in public spaces
63
- when an individual is representing the project or its community. Examples of
64
- representing a project or community include using an official project e-mail
65
- address, posting via an official social media account, or acting as an appointed
66
- representative at an online or offline event. Representation of a project may be
67
- further defined and clarified by project maintainers.
68
-
69
- ## Enforcement
70
-
71
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
72
- reported by contacting the project founder (Tarek) at tarek@shebanglabs.io. All
73
- complaints will be reviewed and investigated and will result in a response that
74
- is deemed necessary and appropriate to the circumstances. The project team is
75
- obligated to maintain confidentiality with regard to the reporter of an incident.
76
- Further details of specific enforcement policies may be posted separately.
77
-
78
- Project maintainers who do not follow or enforce the Code of Conduct in good
79
- faith may face temporary or permanent repercussions as determined by other
80
- members of the project's leadership.
81
-
82
- ## Attribution
83
-
84
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
85
- available at [https://www.contributor-covenant.org/version/2/0/code_of_conduct/][version]
86
-
87
- [homepage]: https://www.contributor-covenant.org
88
- [version]: https://www.contributor-covenant.org/version/2/0/code_of_conduct/
data/CONTRIBUTING.md DELETED
@@ -1,25 +0,0 @@
1
- # Contributing to this repository <!-- omit in toc -->
2
-
3
- ## Getting started <!-- omit in toc -->
4
-
5
- Before you begin:
6
- - This project is a Ruby gem.
7
- - Have you read the [code of conduct](CODE_OF_CONDUCT.md)?
8
- - Check out the [existing issues](https://github.com/rubernetes/gem/issues) & see if we [accept contributions](#types-of-contributions-memo) for your type of issue.
9
-
10
- ### Don't see your issue? Open one
11
-
12
- If you spot something new, open an issue using a [template](https://github.com/rubernetes/gem/issues/new/choose). We'll use the issue to have a conversation about the problem you want to fix.
13
-
14
- ### Ready to make a change?
15
-
16
- At R8s we follow a standard Github `fork -> clone -> edit -> pull request` process. If you are not familiar with this process you can check [this detailed guidance](https://github.com/firstcontributions/first-contributions).
17
-
18
- ### Your PR is merged!
19
- Congratulations! The whole R8s community thanks you. :sparkles:
20
-
21
- Once your PR is merged, you will be proudly listed as a contributor in the [contributor chart](https://github.com/rubernetes/gem/graphs/contributors).
22
-
23
- ## Types of contributions :memo:
24
- You can contribute to the R8s tools and technologies in several ways. Through Issues, Pull requests, Discussions, Reviews and suggested changes.
25
-
data/Gemfile DELETED
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Specify your gem's dependencies in rubernetes.gemspec
6
- gemspec
7
-
8
- gem 'rake', '~> 12.0'
9
- gem 'rspec', '~> 3.0'
10
-
11
- gem 'code-scanning-rubocop', '~> 0.5.0', require: false
12
- gem 'rubocop', '~> 1.12', require: false
13
- gem 'rubocop-rake', '~> 0.5.1', require: false
14
- gem 'rubocop-rspec', '~> 2.2', require: false
data/Gemfile.lock DELETED
@@ -1,65 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- rubernetes (0.0.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- ast (2.4.2)
10
- code-scanning-rubocop (0.5.0)
11
- rubocop (~> 1.0)
12
- diff-lcs (1.4.4)
13
- parallel (1.20.1)
14
- parser (3.0.0.0)
15
- ast (~> 2.4.1)
16
- rainbow (3.0.0)
17
- rake (12.3.3)
18
- regexp_parser (2.1.1)
19
- rexml (3.2.5)
20
- rspec (3.10.0)
21
- rspec-core (~> 3.10.0)
22
- rspec-expectations (~> 3.10.0)
23
- rspec-mocks (~> 3.10.0)
24
- rspec-core (3.10.1)
25
- rspec-support (~> 3.10.0)
26
- rspec-expectations (3.10.1)
27
- diff-lcs (>= 1.2.0, < 2.0)
28
- rspec-support (~> 3.10.0)
29
- rspec-mocks (3.10.2)
30
- diff-lcs (>= 1.2.0, < 2.0)
31
- rspec-support (~> 3.10.0)
32
- rspec-support (3.10.2)
33
- rubocop (1.12.1)
34
- parallel (~> 1.10)
35
- parser (>= 3.0.0.0)
36
- rainbow (>= 2.2.2, < 4.0)
37
- regexp_parser (>= 1.8, < 3.0)
38
- rexml
39
- rubocop-ast (>= 1.2.0, < 2.0)
40
- ruby-progressbar (~> 1.7)
41
- unicode-display_width (>= 1.4.0, < 3.0)
42
- rubocop-ast (1.4.1)
43
- parser (>= 2.7.1.5)
44
- rubocop-rake (0.5.1)
45
- rubocop
46
- rubocop-rspec (2.2.0)
47
- rubocop (~> 1.0)
48
- rubocop-ast (>= 1.1.0)
49
- ruby-progressbar (1.11.0)
50
- unicode-display_width (2.0.0)
51
-
52
- PLATFORMS
53
- ruby
54
-
55
- DEPENDENCIES
56
- code-scanning-rubocop (~> 0.5.0)
57
- rake (~> 12.0)
58
- rspec (~> 3.0)
59
- rubernetes!
60
- rubocop (~> 1.12)
61
- rubocop-rake (~> 0.5.1)
62
- rubocop-rspec (~> 2.2)
63
-
64
- BUNDLED WITH
65
- 2.2.8
data/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2021 rubernetes
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task default: :spec
data/SECURITY.md DELETED
@@ -1,11 +0,0 @@
1
- # Security Policy
2
-
3
- ## Supported Versions
4
-
5
- | Version | Supported |
6
- | ------- | ------------------ |
7
- | 0.0.1 | :white_check_mark: |
8
-
9
- ## Reporting a Vulnerability
10
-
11
- Please reach out to tarek@shebanglabs.io for reporting security vulnerabilities and following up on previous reports.
data/rubernetes.gemspec DELETED
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'lib/rubernetes/version'
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = 'rubernetes'
7
- spec.version = Rubernetes::VERSION
8
- spec.summary = 'Build Kubernetes custom resources controllers in Ruby.'
9
- spec.description = 'A ruby gem to provide the base for building Kubernetes custom resources controllers in Ruby.'
10
-
11
- spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
12
-
13
- spec.license = 'MIT'
14
-
15
- spec.authors = ['Tarek N. Samni', 'Ramy Aboul Naga', 'Hesham Youssef']
16
- spec.email = ['tarek.samni@gmail.com', 'ramy.naga@gmail.com', 'heshamyoussef79@gmail.com']
17
- spec.homepage = 'https://github.com/rubernetes/gem'
18
-
19
- spec.metadata = {
20
- # "allowed_push_host" => "TODO: Set to 'http://mygemserver.com'"
21
- 'bug_tracker_uri' => "#{spec.homepage}/issues",
22
- # "changelog_uri" => "#{spec.homepage}/releases/tag/v#{version}",
23
- 'documentation_uri' => "https://rubydoc.info/#{spec.homepage.gsub(%r{^https?://}, '')}",
24
- 'homepage_uri' => spec.homepage,
25
- 'source_code_uri' => spec.homepage.to_s # /tree/v#{version}
26
- }
27
-
28
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
29
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
30
- end
31
- spec.require_paths = ['lib']
32
- end