kuby-kube-db 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/kuby-kube-db.gemspec +1 -1
  4. data/lib/kuby/kube-db/dsl.rb +3 -1
  5. data/lib/kuby/kube-db/dsl/api/v1.rb +8 -10
  6. data/lib/kuby/kube-db/dsl/api/v1/local_spec.rb +0 -2
  7. data/lib/kuby/kube-db/dsl/api/v1/object_meta.rb +0 -19
  8. data/lib/kuby/kube-db/dsl/api/v1/prometheus_spec.rb +2 -6
  9. data/lib/kuby/kube-db/dsl/api/v1/s3_spec.rb +1 -2
  10. data/lib/kuby/kube-db/dsl/api/v1/service_spec.rb +2 -4
  11. data/lib/kuby/kube-db/dsl/authorization.rb +3 -0
  12. data/lib/kuby/kube-db/dsl/authorization/v1alpha1.rb +24 -0
  13. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/database_access_request.rb +22 -0
  14. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/database_access_request_condition.rb +18 -0
  15. data/lib/kuby/kube-db/dsl/{catalog/v1alpha1/proxy_sql_version_list.rb → authorization/v1alpha1/database_access_request_list.rb} +5 -5
  16. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/database_access_request_spec.rb +19 -0
  17. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/database_access_request_status.rb +19 -0
  18. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/lease.rb +17 -0
  19. data/lib/kuby/kube-db/dsl/{kubedb/v1alpha1/proxy_sql.rb → authorization/v1alpha1/mongo_db_role.rb} +6 -6
  20. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/mongo_db_role_condition.rb +18 -0
  21. data/lib/kuby/kube-db/dsl/{kubedb/v1alpha1/percona_xtra_db_list.rb → authorization/v1alpha1/mongo_db_role_list.rb} +5 -5
  22. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/mongo_db_role_spec.rb +22 -0
  23. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/mongo_db_role_status.rb +18 -0
  24. data/lib/kuby/kube-db/dsl/{kubedb/v1alpha1/percona_xtra_db.rb → authorization/v1alpha1/my_sql_role.rb} +6 -6
  25. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/my_sql_role_condition.rb +18 -0
  26. data/lib/kuby/kube-db/dsl/{kubedb/v1alpha1/proxy_sql_list.rb → authorization/v1alpha1/my_sql_role_list.rb} +5 -5
  27. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/my_sql_role_spec.rb +22 -0
  28. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/my_sql_role_status.rb +18 -0
  29. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/postgres_role.rb +22 -0
  30. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/postgres_role_condition.rb +18 -0
  31. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/postgres_role_list.rb +20 -0
  32. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/postgres_role_spec.rb +24 -0
  33. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/postgres_role_status.rb +18 -0
  34. data/lib/kuby/kube-db/dsl/authorization/v1alpha1/role_reference.rb +17 -0
  35. data/lib/kuby/kube-db/dsl/catalog/v1alpha1.rb +38 -52
  36. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/elasticsearch_version_init_container.rb +1 -2
  37. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/elasticsearch_version_pod_security_policy.rb +2 -1
  38. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/elasticsearch_version_spec.rb +1 -2
  39. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/mongo_db_version_pod_security_policy.rb +2 -1
  40. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/my_sql_version_pod_security_policy.rb +2 -1
  41. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/my_sql_version_spec.rb +0 -2
  42. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/postgres_version_pod_security_policy.rb +2 -1
  43. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1.rb +48 -57
  44. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/backup_schedule_spec.rb +35 -0
  45. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/{pg_bouncer.rb → dormant_database.rb} +5 -5
  46. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/{pg_bouncer_list.rb → dormant_database_list.rb} +4 -4
  47. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/dormant_database_spec.rb +17 -0
  48. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/{percona_xtra_db_status.rb → dormant_database_status.rb} +5 -3
  49. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/elasticsearch_node.rb +1 -2
  50. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/elasticsearch_spec.rb +3 -5
  51. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/etcd_spec.rb +3 -3
  52. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/init_spec.rb +2 -2
  53. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/memcached_spec.rb +1 -3
  54. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/mongo_db_replica_set.rb +2 -0
  55. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/mongo_db_spec.rb +7 -11
  56. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/my_sql_spec.rb +6 -8
  57. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/origin.rb +17 -0
  58. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/origin_spec.rb +27 -0
  59. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/postgres_spec.rb +5 -7
  60. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/redis_spec.rb +1 -3
  61. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/script_source_spec.rb +0 -2
  62. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/{maria_db.rb → snapshot.rb} +5 -5
  63. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/{maria_db_list.rb → snapshot_list.rb} +4 -4
  64. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/snapshot_source_spec.rb +17 -0
  65. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/snapshot_spec.rb +35 -0
  66. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/{proxy_sql_status.rb → snapshot_status.rb} +5 -3
  67. data/lib/kuby/kube-db/dsl/meta.rb +3 -0
  68. data/lib/kuby/kube-db/dsl/meta/v1.rb +4 -0
  69. data/lib/kuby/kube-db/dsl/meta/v1/initializer.rb +15 -0
  70. data/lib/kuby/kube-db/dsl/meta/v1/initializers.rb +17 -0
  71. data/lib/kuby/kube-db/dsl/v1/volume_source.rb +0 -2
  72. data/lib/kuby/kube-db/entrypoint.rb +108 -144
  73. data/lib/kuby/kube-db/version.rb +2 -2
  74. metadata +43 -40
  75. data/lib/kuby/kube-db/dsl/api/v1/prometheus_exporter_spec.rb +0 -22
  76. data/lib/kuby/kube-db/dsl/api/v1/service_monitor_spec.rb +0 -18
  77. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/my_sql_version_replication_mode_detector.rb +0 -15
  78. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/percona_xtra_db_version.rb +0 -20
  79. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/percona_xtra_db_version_database.rb +0 -15
  80. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/percona_xtra_db_version_exporter.rb +0 -15
  81. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/percona_xtra_db_version_init_container.rb +0 -15
  82. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/percona_xtra_db_version_list.rb +0 -20
  83. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/percona_xtra_db_version_pod_security_policy.rb +0 -15
  84. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/percona_xtra_db_version_spec.rb +0 -24
  85. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/proxy_sql_version.rb +0 -20
  86. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/proxy_sql_version_exporter.rb +0 -15
  87. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/proxy_sql_version_pod_security_policy.rb +0 -15
  88. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/proxy_sql_version_proxysql.rb +0 -15
  89. data/lib/kuby/kube-db/dsl/catalog/v1alpha1/proxy_sql_version_spec.rb +0 -22
  90. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/certificate_spec.rb +0 -20
  91. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/connection_pool_config.rb +0 -28
  92. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/databases.rb +0 -20
  93. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/maria_db_spec.rb +0 -36
  94. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/maria_db_status.rb +0 -17
  95. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/percona_xtra_db_spec.rb +0 -38
  96. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/pg_bouncer_spec.rb +0 -31
  97. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/pg_bouncer_status.rb +0 -17
  98. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/proxy_sql_backend_spec.rb +0 -17
  99. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/proxy_sql_spec.rb +0 -34
  100. data/lib/kuby/kube-db/dsl/kubedb/v1alpha1/tls_config.rb +0 -17
@@ -1,20 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class CertificateSpec < ::KubeDSL::DSLObject
3
- value_fields :uri_sa_ns, :dns_names, :renew_before, :ip_addresses, :duration, :organization
4
-
5
- def serialize
6
- {}.tap do |result|
7
- result[:uriSANs] = uri_sa_ns
8
- result[:dnsNames] = dns_names
9
- result[:renewBefore] = renew_before
10
- result[:ipAddresses] = ip_addresses
11
- result[:duration] = duration
12
- result[:organization] = organization
13
- end
14
- end
15
-
16
- def kind_sym
17
- :certificate_spec
18
- end
19
- end
20
- end
@@ -1,28 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class ConnectionPoolConfig < ::KubeDSL::DSLObject
3
- value_fields :default_pool_size, :auth_type, :auth_user, :max_db_connections, :stats_period_seconds, :max_user_connections, :reserve_pool_size, :pool_mode, :port, :ignore_startup_parameters, :reserve_pool_timeout_seconds, :max_client_connections, :min_pool_size, :admin_users
4
-
5
- def serialize
6
- {}.tap do |result|
7
- result[:defaultPoolSize] = default_pool_size
8
- result[:authType] = auth_type
9
- result[:authUser] = auth_user
10
- result[:maxDBConnections] = max_db_connections
11
- result[:statsPeriodSeconds] = stats_period_seconds
12
- result[:maxUserConnections] = max_user_connections
13
- result[:reservePoolSize] = reserve_pool_size
14
- result[:poolMode] = pool_mode
15
- result[:port] = port
16
- result[:ignoreStartupParameters] = ignore_startup_parameters
17
- result[:reservePoolTimeoutSeconds] = reserve_pool_timeout_seconds
18
- result[:maxClientConnections] = max_client_connections
19
- result[:minPoolSize] = min_pool_size
20
- result[:adminUsers] = admin_users
21
- end
22
- end
23
-
24
- def kind_sym
25
- :connection_pool_config
26
- end
27
- end
28
- end
@@ -1,20 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class Databases < ::KubeDSL::DSLObject
3
- value_fields :alias, :database_name
4
- object_field(:database_secret_ref) { KubeDSL::DSL::V1::LocalObjectReference.new }
5
- object_field(:database_ref) { Kuby::KubeDB::DSL::Appcatalog::V1alpha1::AppReference.new }
6
-
7
- def serialize
8
- {}.tap do |result|
9
- result[:alias] = alias
10
- result[:databaseName] = database_name
11
- result[:databaseSecretRef] = database_secret_ref.serialize
12
- result[:databaseRef] = database_ref.serialize
13
- end
14
- end
15
-
16
- def kind_sym
17
- :databases
18
- end
19
- end
20
- end
@@ -1,36 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class MariaDBSpec < ::KubeDSL::DSLObject
3
- value_fields :paused, :replicas, :termination_policy, :halted, :storage_type, :version
4
- object_field(:service_template) { Kuby::KubeDB::DSL::Api::V1::ServiceTemplateSpec.new }
5
- object_field(:monitor) { Kuby::KubeDB::DSL::Api::V1::AgentSpec.new }
6
- object_field(:pod_template) { Kuby::KubeDB::DSL::Api::V1::PodTemplateSpec.new }
7
- object_field(:storage) { KubeDSL::DSL::V1::PersistentVolumeClaimSpec.new }
8
- object_field(:config_source) { Kuby::KubeDB::DSL::V1::VolumeSource.new }
9
- object_field(:database_secret) { KubeDSL::DSL::V1::SecretVolumeSource.new }
10
- object_field(:init) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::InitSpec.new }
11
- object_field(:update_strategy) { KubeDSL::DSL::Apps::V1::StatefulSetUpdateStrategy.new }
12
-
13
- def serialize
14
- {}.tap do |result|
15
- result[:paused] = paused
16
- result[:replicas] = replicas
17
- result[:terminationPolicy] = termination_policy
18
- result[:halted] = halted
19
- result[:storageType] = storage_type
20
- result[:version] = version
21
- result[:serviceTemplate] = service_template.serialize
22
- result[:monitor] = monitor.serialize
23
- result[:podTemplate] = pod_template.serialize
24
- result[:storage] = storage.serialize
25
- result[:configSource] = config_source.serialize
26
- result[:databaseSecret] = database_secret.serialize
27
- result[:init] = init.serialize
28
- result[:updateStrategy] = update_strategy.serialize
29
- end
30
- end
31
-
32
- def kind_sym
33
- :maria_db_spec
34
- end
35
- end
36
- end
@@ -1,17 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class MariaDBStatus < ::KubeDSL::DSLObject
3
- value_fields :observed_generation, :phase, :reason
4
-
5
- def serialize
6
- {}.tap do |result|
7
- result[:observedGeneration] = observed_generation
8
- result[:phase] = phase
9
- result[:reason] = reason
10
- end
11
- end
12
-
13
- def kind_sym
14
- :maria_db_status
15
- end
16
- end
17
- end
@@ -1,38 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class PerconaXtraDBSpec < ::KubeDSL::DSLObject
3
- value_fields :paused, :replicas, :termination_policy, :halted, :storage_type, :version
4
- object_field(:tls) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::TLSConfig.new }
5
- object_field(:service_template) { Kuby::KubeDB::DSL::Api::V1::ServiceTemplateSpec.new }
6
- object_field(:monitor) { Kuby::KubeDB::DSL::Api::V1::AgentSpec.new }
7
- object_field(:pod_template) { Kuby::KubeDB::DSL::Api::V1::PodTemplateSpec.new }
8
- object_field(:storage) { KubeDSL::DSL::V1::PersistentVolumeClaimSpec.new }
9
- object_field(:config_source) { Kuby::KubeDB::DSL::V1::VolumeSource.new }
10
- object_field(:database_secret) { KubeDSL::DSL::V1::SecretVolumeSource.new }
11
- object_field(:init) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::InitSpec.new }
12
- object_field(:update_strategy) { KubeDSL::DSL::Apps::V1::StatefulSetUpdateStrategy.new }
13
-
14
- def serialize
15
- {}.tap do |result|
16
- result[:paused] = paused
17
- result[:replicas] = replicas
18
- result[:terminationPolicy] = termination_policy
19
- result[:halted] = halted
20
- result[:storageType] = storage_type
21
- result[:version] = version
22
- result[:tls] = tls.serialize
23
- result[:serviceTemplate] = service_template.serialize
24
- result[:monitor] = monitor.serialize
25
- result[:podTemplate] = pod_template.serialize
26
- result[:storage] = storage.serialize
27
- result[:configSource] = config_source.serialize
28
- result[:databaseSecret] = database_secret.serialize
29
- result[:init] = init.serialize
30
- result[:updateStrategy] = update_strategy.serialize
31
- end
32
- end
33
-
34
- def kind_sym
35
- :percona_xtra_db_spec
36
- end
37
- end
38
- end
@@ -1,31 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class PgBouncerSpec < ::KubeDSL::DSLObject
3
- value_fields :replicas, :paused, :version
4
- array_field(:database) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::Databases.new }
5
- object_field(:tls) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::TLSConfig.new }
6
- object_field(:service_template) { Kuby::KubeDB::DSL::Api::V1::ServiceTemplateSpec.new }
7
- object_field(:monitor) { Kuby::KubeDB::DSL::Api::V1::AgentSpec.new }
8
- object_field(:pod_template) { Kuby::KubeDB::DSL::Api::V1::PodTemplateSpec.new }
9
- object_field(:connection_pool) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::ConnectionPoolConfig.new }
10
- object_field(:user_list_secret_ref) { KubeDSL::DSL::V1::LocalObjectReference.new }
11
-
12
- def serialize
13
- {}.tap do |result|
14
- result[:replicas] = replicas
15
- result[:paused] = paused
16
- result[:version] = version
17
- result[:databases] = databases.map(&:serialize)
18
- result[:tls] = tls.serialize
19
- result[:serviceTemplate] = service_template.serialize
20
- result[:monitor] = monitor.serialize
21
- result[:podTemplate] = pod_template.serialize
22
- result[:connectionPool] = connection_pool.serialize
23
- result[:userListSecretRef] = user_list_secret_ref.serialize
24
- end
25
- end
26
-
27
- def kind_sym
28
- :pg_bouncer_spec
29
- end
30
- end
31
- end
@@ -1,17 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class PgBouncerStatus < ::KubeDSL::DSLObject
3
- value_fields :observed_generation, :phase, :reason
4
-
5
- def serialize
6
- {}.tap do |result|
7
- result[:observedGeneration] = observed_generation
8
- result[:phase] = phase
9
- result[:reason] = reason
10
- end
11
- end
12
-
13
- def kind_sym
14
- :pg_bouncer_status
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class ProxySQLBackendSpec < ::KubeDSL::DSLObject
3
- value_fields :replicas
4
- object_field(:ref) { KubeDSL::DSL::V1::TypedLocalObjectReference.new }
5
-
6
- def serialize
7
- {}.tap do |result|
8
- result[:replicas] = replicas
9
- result[:ref] = ref.serialize
10
- end
11
- end
12
-
13
- def kind_sym
14
- :proxy_sql_backend_spec
15
- end
16
- end
17
- end
@@ -1,34 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class ProxySQLSpec < ::KubeDSL::DSLObject
3
- value_fields :replicas, :paused, :version, :mode
4
- object_field(:tls) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::TLSConfig.new }
5
- object_field(:service_template) { Kuby::KubeDB::DSL::Api::V1::ServiceTemplateSpec.new }
6
- object_field(:monitor) { Kuby::KubeDB::DSL::Api::V1::AgentSpec.new }
7
- object_field(:pod_template) { Kuby::KubeDB::DSL::Api::V1::PodTemplateSpec.new }
8
- object_field(:config_source) { Kuby::KubeDB::DSL::V1::VolumeSource.new }
9
- object_field(:proxysql_secret) { KubeDSL::DSL::V1::SecretVolumeSource.new }
10
- object_field(:update_strategy) { KubeDSL::DSL::Apps::V1::StatefulSetUpdateStrategy.new }
11
- object_field(:backend) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::ProxySQLBackendSpec.new }
12
-
13
- def serialize
14
- {}.tap do |result|
15
- result[:replicas] = replicas
16
- result[:paused] = paused
17
- result[:version] = version
18
- result[:mode] = mode
19
- result[:tls] = tls.serialize
20
- result[:serviceTemplate] = service_template.serialize
21
- result[:monitor] = monitor.serialize
22
- result[:podTemplate] = pod_template.serialize
23
- result[:configSource] = config_source.serialize
24
- result[:proxysqlSecret] = proxysql_secret.serialize
25
- result[:updateStrategy] = update_strategy.serialize
26
- result[:backend] = backend.serialize
27
- end
28
- end
29
-
30
- def kind_sym
31
- :proxy_sql_spec
32
- end
33
- end
34
- end
@@ -1,17 +0,0 @@
1
- module Kuby::KubeDB::DSL::Kubedb::V1alpha1
2
- class TLSConfig < ::KubeDSL::DSLObject
3
- object_field(:issuer_ref) { KubeDSL::DSL::V1::TypedLocalObjectReference.new }
4
- object_field(:certificate) { Kuby::KubeDB::DSL::Kubedb::V1alpha1::CertificateSpec.new }
5
-
6
- def serialize
7
- {}.tap do |result|
8
- result[:issuerRef] = issuer_ref.serialize
9
- result[:certificate] = certificate.serialize
10
- end
11
- end
12
-
13
- def kind_sym
14
- :tls_config
15
- end
16
- end
17
- end