google-api-client 0.31.0 → 0.32.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.kokoro/continuous/linux.cfg +11 -1
- data/.kokoro/continuous/osx.cfg +5 -0
- data/.kokoro/continuous/windows.cfg +10 -0
- data/.kokoro/presubmit/linux.cfg +11 -1
- data/.kokoro/presubmit/osx.cfg +5 -0
- data/.kokoro/presubmit/windows.cfg +10 -0
- data/CHANGELOG.md +107 -0
- data/generated/google/apis/androidmanagement_v1.rb +1 -1
- data/generated/google/apis/androidmanagement_v1/classes.rb +12 -1
- data/generated/google/apis/androidmanagement_v1/representations.rb +1 -0
- data/generated/google/apis/bigquery_v2.rb +1 -1
- data/generated/google/apis/bigquery_v2/classes.rb +241 -0
- data/generated/google/apis/bigquery_v2/representations.rb +115 -0
- data/generated/google/apis/bigqueryconnection_v1beta1.rb +1 -1
- data/generated/google/apis/bigqueryconnection_v1beta1/classes.rb +62 -29
- data/generated/google/apis/bigquerydatatransfer_v1.rb +1 -1
- data/generated/google/apis/bigquerydatatransfer_v1/classes.rb +2 -2
- data/generated/google/apis/bigquerydatatransfer_v1/service.rb +30 -26
- data/generated/google/apis/bigqueryreservation_v1.rb +1 -1
- data/generated/google/apis/bigqueryreservation_v1/classes.rb +7 -7
- data/generated/google/apis/bigqueryreservation_v1/representations.rb +3 -3
- data/generated/google/apis/bigqueryreservation_v1alpha2.rb +1 -1
- data/generated/google/apis/bigqueryreservation_v1alpha2/classes.rb +0 -175
- data/generated/google/apis/bigqueryreservation_v1alpha2/representations.rb +0 -65
- data/generated/google/apis/bigqueryreservation_v1alpha2/service.rb +0 -140
- data/generated/google/apis/bigqueryreservation_v1beta1.rb +37 -0
- data/generated/google/apis/bigqueryreservation_v1beta1/classes.rb +497 -0
- data/generated/google/apis/bigqueryreservation_v1beta1/representations.rb +236 -0
- data/generated/google/apis/bigqueryreservation_v1beta1/service.rb +713 -0
- data/generated/google/apis/binaryauthorization_v1.rb +1 -1
- data/generated/google/apis/binaryauthorization_v1/classes.rb +307 -0
- data/generated/google/apis/binaryauthorization_v1/representations.rb +88 -0
- data/generated/google/apis/binaryauthorization_v1/service.rb +230 -0
- data/generated/google/apis/binaryauthorization_v1beta1.rb +1 -1
- data/generated/google/apis/binaryauthorization_v1beta1/classes.rb +62 -29
- data/generated/google/apis/blogger_v3.rb +1 -1
- data/generated/google/apis/blogger_v3/service.rb +6 -6
- data/generated/google/apis/calendar_v3.rb +1 -1
- data/generated/google/apis/calendar_v3/classes.rb +1 -0
- data/generated/google/apis/cloudasset_v1.rb +1 -1
- data/generated/google/apis/cloudasset_v1/classes.rb +72 -29
- data/generated/google/apis/cloudasset_v1/representations.rb +1 -0
- data/generated/google/apis/cloudasset_v1/service.rb +1 -1
- data/generated/google/apis/cloudasset_v1beta1.rb +1 -1
- data/generated/google/apis/cloudasset_v1beta1/classes.rb +62 -29
- data/generated/google/apis/cloudasset_v1beta1/service.rb +2 -2
- data/generated/google/apis/cloudfunctions_v1.rb +1 -1
- data/generated/google/apis/cloudfunctions_v1/classes.rb +7 -2
- data/generated/google/apis/cloudfunctions_v1/service.rb +10 -7
- data/generated/google/apis/cloudfunctions_v1beta2.rb +1 -1
- data/generated/google/apis/cloudfunctions_v1beta2/classes.rb +1 -1
- data/generated/google/apis/cloudfunctions_v1beta2/service.rb +7 -6
- data/generated/google/apis/cloudidentity_v1.rb +4 -1
- data/generated/google/apis/cloudidentity_v1beta1.rb +4 -1
- data/generated/google/apis/cloudiot_v1.rb +1 -1
- data/generated/google/apis/cloudiot_v1/classes.rb +68 -35
- data/generated/google/apis/cloudiot_v1/service.rb +18 -17
- data/generated/google/apis/cloudkms_v1.rb +1 -1
- data/generated/google/apis/cloudkms_v1/classes.rb +77 -35
- data/generated/google/apis/cloudkms_v1/service.rb +33 -27
- data/generated/google/apis/cloudprivatecatalogproducer_v1beta1.rb +1 -1
- data/generated/google/apis/cloudprivatecatalogproducer_v1beta1/classes.rb +62 -29
- data/generated/google/apis/cloudsearch_v1.rb +1 -1
- data/generated/google/apis/cloudsearch_v1/classes.rb +354 -0
- data/generated/google/apis/cloudsearch_v1/representations.rb +196 -0
- data/generated/google/apis/cloudsearch_v1/service.rb +314 -2
- data/generated/google/apis/cloudtasks_v2beta3.rb +1 -1
- data/generated/google/apis/cloudtasks_v2beta3/classes.rb +62 -29
- data/generated/google/apis/cloudtrace_v1.rb +1 -1
- data/generated/google/apis/cloudtrace_v1/classes.rb +1 -1
- data/generated/google/apis/cloudtrace_v1/service.rb +10 -10
- data/generated/google/apis/cloudtrace_v2.rb +1 -1
- data/generated/google/apis/cloudtrace_v2/classes.rb +3 -3
- data/generated/google/apis/commentanalyzer_v1alpha1.rb +1 -1
- data/generated/google/apis/commentanalyzer_v1alpha1/classes.rb +7 -10
- data/generated/google/apis/compute_alpha.rb +1 -1
- data/generated/google/apis/compute_alpha/classes.rb +38 -42
- data/generated/google/apis/compute_alpha/representations.rb +5 -16
- data/generated/google/apis/compute_beta.rb +1 -1
- data/generated/google/apis/compute_beta/classes.rb +10 -5
- data/generated/google/apis/compute_v1.rb +1 -1
- data/generated/google/apis/compute_v1/classes.rb +1327 -4
- data/generated/google/apis/compute_v1/representations.rb +439 -0
- data/generated/google/apis/container_v1.rb +1 -1
- data/generated/google/apis/container_v1/classes.rb +111 -0
- data/generated/google/apis/container_v1/representations.rb +51 -0
- data/generated/google/apis/containeranalysis_v1alpha1.rb +1 -1
- data/generated/google/apis/containeranalysis_v1alpha1/classes.rb +76 -30
- data/generated/google/apis/containeranalysis_v1alpha1/representations.rb +1 -0
- data/generated/google/apis/containeranalysis_v1beta1.rb +1 -1
- data/generated/google/apis/containeranalysis_v1beta1/classes.rb +70 -30
- data/generated/google/apis/content_v2.rb +1 -1
- data/generated/google/apis/content_v2/service.rb +0 -226
- data/generated/google/apis/dataflow_v1b3.rb +1 -1
- data/generated/google/apis/dataflow_v1b3/classes.rb +42 -0
- data/generated/google/apis/dataflow_v1b3/representations.rb +4 -0
- data/generated/google/apis/dataproc_v1.rb +1 -1
- data/generated/google/apis/dataproc_v1/classes.rb +324 -38
- data/generated/google/apis/dataproc_v1/representations.rb +97 -0
- data/generated/google/apis/dataproc_v1/service.rb +613 -1
- data/generated/google/apis/dataproc_v1beta2.rb +1 -1
- data/generated/google/apis/dataproc_v1beta2/classes.rb +100 -54
- data/generated/google/apis/dataproc_v1beta2/service.rb +29 -22
- data/generated/google/apis/dialogflow_v2.rb +1 -1
- data/generated/google/apis/dialogflow_v2/classes.rb +363 -167
- data/generated/google/apis/dialogflow_v2/representations.rb +160 -49
- data/generated/google/apis/dialogflow_v2/service.rb +1 -1
- data/generated/google/apis/dialogflow_v2beta1.rb +1 -1
- data/generated/google/apis/dialogflow_v2beta1/classes.rb +433 -178
- data/generated/google/apis/dialogflow_v2beta1/representations.rb +199 -59
- data/generated/google/apis/dialogflow_v2beta1/service.rb +39 -0
- data/generated/google/apis/dlp_v2.rb +1 -1
- data/generated/google/apis/dlp_v2/classes.rb +3 -4
- data/generated/google/apis/doubleclickbidmanager_v1.rb +1 -1
- data/generated/google/apis/drive_v2.rb +1 -1
- data/generated/google/apis/drive_v2/classes.rb +2 -2
- data/generated/google/apis/drive_v3.rb +1 -1
- data/generated/google/apis/drive_v3/classes.rb +2 -2
- data/generated/google/apis/fcm_v1.rb +1 -1
- data/generated/google/apis/fcm_v1/classes.rb +9 -4
- data/generated/google/apis/file_v1.rb +1 -1
- data/generated/google/apis/file_v1/classes.rb +8 -0
- data/generated/google/apis/file_v1/representations.rb +1 -0
- data/generated/google/apis/file_v1/service.rb +2 -0
- data/generated/google/apis/file_v1beta1.rb +1 -1
- data/generated/google/apis/file_v1beta1/classes.rb +8 -0
- data/generated/google/apis/file_v1beta1/representations.rb +1 -0
- data/generated/google/apis/file_v1beta1/service.rb +2 -0
- data/generated/google/apis/firebase_v1beta1.rb +1 -1
- data/generated/google/apis/firebase_v1beta1/classes.rb +41 -4
- data/generated/google/apis/firebase_v1beta1/representations.rb +2 -0
- data/generated/google/apis/firebase_v1beta1/service.rb +22 -14
- data/generated/google/apis/fitness_v1.rb +19 -19
- data/generated/google/apis/healthcare_v1beta1.rb +1 -1
- data/generated/google/apis/healthcare_v1beta1/classes.rb +136 -100
- data/generated/google/apis/healthcare_v1beta1/representations.rb +1 -1
- data/generated/google/apis/healthcare_v1beta1/service.rb +124 -119
- data/generated/google/apis/iam_v1.rb +1 -1
- data/generated/google/apis/iam_v1/classes.rb +87 -41
- data/generated/google/apis/iap_v1.rb +1 -1
- data/generated/google/apis/iap_v1/classes.rb +62 -29
- data/generated/google/apis/iap_v1beta1.rb +1 -1
- data/generated/google/apis/iap_v1beta1/classes.rb +62 -29
- data/generated/google/apis/ml_v1.rb +1 -1
- data/generated/google/apis/ml_v1/classes.rb +114 -49
- data/generated/google/apis/ml_v1/representations.rb +2 -0
- data/generated/google/apis/ml_v1/service.rb +12 -6
- data/generated/google/apis/monitoring_v3.rb +1 -1
- data/generated/google/apis/monitoring_v3/classes.rb +14 -10
- data/generated/google/apis/monitoring_v3/representations.rb +1 -0
- data/generated/google/apis/oslogin_v1.rb +1 -1
- data/generated/google/apis/oslogin_v1/classes.rb +12 -0
- data/generated/google/apis/oslogin_v1/representations.rb +2 -0
- data/generated/google/apis/oslogin_v1alpha.rb +1 -1
- data/generated/google/apis/oslogin_v1alpha/classes.rb +12 -0
- data/generated/google/apis/oslogin_v1alpha/representations.rb +2 -0
- data/generated/google/apis/oslogin_v1beta.rb +1 -1
- data/generated/google/apis/oslogin_v1beta/classes.rb +12 -0
- data/generated/google/apis/oslogin_v1beta/representations.rb +2 -0
- data/generated/google/apis/policytroubleshooter_v1beta.rb +34 -0
- data/generated/google/apis/policytroubleshooter_v1beta/classes.rb +621 -0
- data/generated/google/apis/policytroubleshooter_v1beta/representations.rb +203 -0
- data/generated/google/apis/policytroubleshooter_v1beta/service.rb +91 -0
- data/generated/google/apis/proximitybeacon_v1beta1.rb +1 -1
- data/generated/google/apis/proximitybeacon_v1beta1/classes.rb +7 -4
- data/generated/google/apis/proximitybeacon_v1beta1/service.rb +60 -58
- data/generated/google/apis/recommender_v1beta1.rb +34 -0
- data/generated/google/apis/recommender_v1beta1/classes.rb +502 -0
- data/generated/google/apis/recommender_v1beta1/representations.rb +232 -0
- data/generated/google/apis/recommender_v1beta1/service.rb +262 -0
- data/generated/google/apis/remotebuildexecution_v1.rb +1 -1
- data/generated/google/apis/remotebuildexecution_v1/classes.rb +49 -1100
- data/generated/google/apis/remotebuildexecution_v1/representations.rb +1 -276
- data/generated/google/apis/remotebuildexecution_v1/service.rb +0 -77
- data/generated/google/apis/remotebuildexecution_v1alpha.rb +1 -1
- data/generated/google/apis/remotebuildexecution_v1alpha/classes.rb +12 -990
- data/generated/google/apis/remotebuildexecution_v1alpha/representations.rb +1 -245
- data/generated/google/apis/remotebuildexecution_v2.rb +1 -1
- data/generated/google/apis/remotebuildexecution_v2/classes.rb +12 -990
- data/generated/google/apis/remotebuildexecution_v2/representations.rb +1 -245
- data/generated/google/apis/run_v1.rb +1 -1
- data/generated/google/apis/run_v1/classes.rb +3553 -33
- data/generated/google/apis/run_v1/representations.rb +1186 -4
- data/generated/google/apis/run_v1/service.rb +2509 -23
- data/generated/google/apis/run_v1alpha1.rb +1 -1
- data/generated/google/apis/run_v1alpha1/classes.rb +103 -140
- data/generated/google/apis/run_v1alpha1/representations.rb +5 -43
- data/generated/google/apis/run_v1beta1.rb +35 -0
- data/generated/google/apis/run_v1beta1/classes.rb +1209 -0
- data/generated/google/apis/run_v1beta1/representations.rb +421 -0
- data/generated/google/apis/run_v1beta1/service.rb +172 -0
- data/generated/google/apis/runtimeconfig_v1beta1.rb +1 -1
- data/generated/google/apis/runtimeconfig_v1beta1/classes.rb +62 -29
- data/generated/google/apis/safebrowsing_v4.rb +5 -2
- data/generated/google/apis/safebrowsing_v4/service.rb +4 -1
- data/generated/google/apis/securitycenter_v1.rb +1 -1
- data/generated/google/apis/securitycenter_v1/classes.rb +70 -35
- data/generated/google/apis/securitycenter_v1/service.rb +13 -12
- data/generated/google/apis/securitycenter_v1beta1.rb +1 -1
- data/generated/google/apis/securitycenter_v1beta1/classes.rb +71 -35
- data/generated/google/apis/securitycenter_v1beta1/service.rb +13 -12
- data/generated/google/apis/servicebroker_v1.rb +1 -1
- data/generated/google/apis/servicebroker_v1/classes.rb +62 -29
- data/generated/google/apis/servicebroker_v1alpha1.rb +1 -1
- data/generated/google/apis/servicebroker_v1alpha1/classes.rb +62 -29
- data/generated/google/apis/servicebroker_v1beta1.rb +1 -1
- data/generated/google/apis/servicebroker_v1beta1/classes.rb +62 -29
- data/generated/google/apis/serviceconsumermanagement_v1.rb +1 -1
- data/generated/google/apis/serviceconsumermanagement_v1/classes.rb +11 -2
- data/generated/google/apis/serviceconsumermanagement_v1/representations.rb +1 -0
- data/generated/google/apis/servicemanagement_v1.rb +1 -1
- data/generated/google/apis/servicemanagement_v1/classes.rb +63 -33
- data/generated/google/apis/servicenetworking_v1.rb +1 -1
- data/generated/google/apis/servicenetworking_v1/classes.rb +11 -2
- data/generated/google/apis/servicenetworking_v1/representations.rb +1 -0
- data/generated/google/apis/servicenetworking_v1beta.rb +1 -1
- data/generated/google/apis/servicenetworking_v1beta/classes.rb +11 -2
- data/generated/google/apis/servicenetworking_v1beta/representations.rb +1 -0
- data/generated/google/apis/serviceusage_v1.rb +1 -1
- data/generated/google/apis/serviceusage_v1/classes.rb +11 -2
- data/generated/google/apis/serviceusage_v1/representations.rb +1 -0
- data/generated/google/apis/serviceusage_v1beta1.rb +1 -1
- data/generated/google/apis/serviceusage_v1beta1/classes.rb +11 -2
- data/generated/google/apis/serviceusage_v1beta1/representations.rb +1 -0
- data/generated/google/apis/spanner_v1.rb +1 -1
- data/generated/google/apis/spanner_v1/classes.rb +78 -2
- data/generated/google/apis/spanner_v1/representations.rb +44 -0
- data/generated/google/apis/spanner_v1/service.rb +35 -0
- data/generated/google/apis/speech_v1.rb +1 -1
- data/generated/google/apis/speech_v1/classes.rb +73 -19
- data/generated/google/apis/speech_v1/representations.rb +18 -0
- data/generated/google/apis/speech_v1p1beta1.rb +1 -1
- data/generated/google/apis/speech_v1p1beta1/classes.rb +31 -35
- data/generated/google/apis/speech_v2beta.rb +1 -1
- data/generated/google/apis/speech_v2beta/classes.rb +6 -6
- data/generated/google/apis/speech_v2beta/representations.rb +2 -2
- data/generated/google/apis/storage_v1.rb +1 -1
- data/generated/google/apis/storage_v1/classes.rb +1 -1
- data/generated/google/apis/storage_v1/representations.rb +2 -1
- data/generated/google/apis/storage_v1beta1.rb +1 -1
- data/generated/google/apis/storage_v1beta2.rb +1 -1
- data/generated/google/apis/streetviewpublish_v1.rb +1 -1
- data/generated/google/apis/streetviewpublish_v1/classes.rb +1 -1
- data/generated/google/apis/streetviewpublish_v1/service.rb +9 -5
- data/generated/google/apis/testing_v1.rb +1 -1
- data/generated/google/apis/testing_v1/classes.rb +42 -0
- data/generated/google/apis/testing_v1/representations.rb +18 -0
- data/generated/google/apis/texttospeech_v1.rb +1 -1
- data/generated/google/apis/texttospeech_v1/classes.rb +6 -5
- data/generated/google/apis/texttospeech_v1/service.rb +1 -1
- data/generated/google/apis/texttospeech_v1beta1.rb +1 -1
- data/generated/google/apis/texttospeech_v1beta1/classes.rb +6 -5
- data/generated/google/apis/texttospeech_v1beta1/service.rb +1 -1
- data/generated/google/apis/toolresults_v1beta3.rb +1 -1
- data/generated/google/apis/toolresults_v1beta3/classes.rb +1 -1
- data/generated/google/apis/translate_v3beta1.rb +1 -1
- data/generated/google/apis/translate_v3beta1/classes.rb +22 -16
- data/generated/google/apis/translate_v3beta1/service.rb +31 -31
- data/generated/google/apis/videointelligence_v1.rb +1 -1
- data/generated/google/apis/videointelligence_v1/classes.rb +45 -10
- data/generated/google/apis/videointelligence_v1beta2.rb +1 -1
- data/generated/google/apis/videointelligence_v1beta2/classes.rb +45 -10
- data/generated/google/apis/videointelligence_v1p1beta1.rb +1 -1
- data/generated/google/apis/videointelligence_v1p1beta1/classes.rb +45 -10
- data/generated/google/apis/videointelligence_v1p2beta1.rb +1 -1
- data/generated/google/apis/videointelligence_v1p2beta1/classes.rb +45 -10
- data/generated/google/apis/videointelligence_v1p3beta1.rb +1 -1
- data/generated/google/apis/videointelligence_v1p3beta1/classes.rb +45 -10
- data/generated/google/apis/vision_v1.rb +1 -1
- data/generated/google/apis/vision_v1/classes.rb +6 -156
- data/generated/google/apis/vision_v1/representations.rb +0 -44
- data/generated/google/apis/vision_v1p1beta1.rb +1 -1
- data/generated/google/apis/vision_v1p1beta1/classes.rb +6 -156
- data/generated/google/apis/vision_v1p1beta1/representations.rb +0 -44
- data/generated/google/apis/vision_v1p2beta1.rb +1 -1
- data/generated/google/apis/vision_v1p2beta1/classes.rb +6 -156
- data/generated/google/apis/vision_v1p2beta1/representations.rb +0 -44
- data/generated/google/apis/websecurityscanner_v1.rb +1 -1
- data/generated/google/apis/websecurityscanner_v1alpha.rb +1 -1
- data/generated/google/apis/websecurityscanner_v1alpha/classes.rb +21 -31
- data/generated/google/apis/websecurityscanner_v1alpha/service.rb +1 -1
- data/generated/google/apis/websecurityscanner_v1beta.rb +1 -1
- data/generated/google/apis/websecurityscanner_v1beta/classes.rb +30 -42
- data/generated/google/apis/websecurityscanner_v1beta/service.rb +1 -1
- data/generated/google/apis/youtube_partner_v1.rb +1 -1
- data/generated/google/apis/youtube_partner_v1/classes.rb +0 -83
- data/generated/google/apis/youtube_partner_v1/representations.rb +0 -35
- data/generated/google/apis/youtube_partner_v1/service.rb +0 -100
- data/lib/google/apis/version.rb +1 -1
- metadata +18 -6
- data/generated/google/apis/dfareporting_v3_1.rb +0 -40
- data/generated/google/apis/dfareporting_v3_1/classes.rb +0 -11998
- data/generated/google/apis/dfareporting_v3_1/representations.rb +0 -4313
- data/generated/google/apis/dfareporting_v3_1/service.rb +0 -8688
@@ -0,0 +1,34 @@
|
|
1
|
+
# Copyright 2015 Google Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'google/apis/recommender_v1beta1/service.rb'
|
16
|
+
require 'google/apis/recommender_v1beta1/classes.rb'
|
17
|
+
require 'google/apis/recommender_v1beta1/representations.rb'
|
18
|
+
|
19
|
+
module Google
|
20
|
+
module Apis
|
21
|
+
# Recommender API
|
22
|
+
#
|
23
|
+
#
|
24
|
+
#
|
25
|
+
# @see https://cloud.google.com/recommender/docs/
|
26
|
+
module RecommenderV1beta1
|
27
|
+
VERSION = 'V1beta1'
|
28
|
+
REVISION = '20190922'
|
29
|
+
|
30
|
+
# View and manage your data across Google Cloud Platform services
|
31
|
+
AUTH_CLOUD_PLATFORM = 'https://www.googleapis.com/auth/cloud-platform'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,502 @@
|
|
1
|
+
# Copyright 2015 Google Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'date'
|
16
|
+
require 'google/apis/core/base_service'
|
17
|
+
require 'google/apis/core/json_representation'
|
18
|
+
require 'google/apis/core/hashable'
|
19
|
+
require 'google/apis/errors'
|
20
|
+
|
21
|
+
module Google
|
22
|
+
module Apis
|
23
|
+
module RecommenderV1beta1
|
24
|
+
|
25
|
+
# Contains metadata about how much money a recommendation can save or incur.
|
26
|
+
class GoogleCloudRecommenderV1beta1CostProjection
|
27
|
+
include Google::Apis::Core::Hashable
|
28
|
+
|
29
|
+
# Represents an amount of money with its currency type.
|
30
|
+
# Corresponds to the JSON property `cost`
|
31
|
+
# @return [Google::Apis::RecommenderV1beta1::GoogleTypeMoney]
|
32
|
+
attr_accessor :cost
|
33
|
+
|
34
|
+
# Duration for which this cost applies.
|
35
|
+
# Corresponds to the JSON property `duration`
|
36
|
+
# @return [String]
|
37
|
+
attr_accessor :duration
|
38
|
+
|
39
|
+
def initialize(**args)
|
40
|
+
update!(**args)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Update properties of this object
|
44
|
+
def update!(**args)
|
45
|
+
@cost = args[:cost] if args.key?(:cost)
|
46
|
+
@duration = args[:duration] if args.key?(:duration)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Contains the impact a recommendation can have for a given category.
|
51
|
+
class GoogleCloudRecommenderV1beta1Impact
|
52
|
+
include Google::Apis::Core::Hashable
|
53
|
+
|
54
|
+
# Category that is being targeted.
|
55
|
+
# Corresponds to the JSON property `category`
|
56
|
+
# @return [String]
|
57
|
+
attr_accessor :category
|
58
|
+
|
59
|
+
# Contains metadata about how much money a recommendation can save or incur.
|
60
|
+
# Corresponds to the JSON property `costProjection`
|
61
|
+
# @return [Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1CostProjection]
|
62
|
+
attr_accessor :cost_projection
|
63
|
+
|
64
|
+
def initialize(**args)
|
65
|
+
update!(**args)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Update properties of this object
|
69
|
+
def update!(**args)
|
70
|
+
@category = args[:category] if args.key?(:category)
|
71
|
+
@cost_projection = args[:cost_projection] if args.key?(:cost_projection)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Response to the `ListRecommendations` method.
|
76
|
+
class GoogleCloudRecommenderV1beta1ListRecommendationsResponse
|
77
|
+
include Google::Apis::Core::Hashable
|
78
|
+
|
79
|
+
# A token that can be used to request the next page of results. This field is
|
80
|
+
# empty if there are no additional results.
|
81
|
+
# Corresponds to the JSON property `nextPageToken`
|
82
|
+
# @return [String]
|
83
|
+
attr_accessor :next_page_token
|
84
|
+
|
85
|
+
# The set of recommendations for the `parent` resource.
|
86
|
+
# Corresponds to the JSON property `recommendations`
|
87
|
+
# @return [Array<Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1Recommendation>]
|
88
|
+
attr_accessor :recommendations
|
89
|
+
|
90
|
+
def initialize(**args)
|
91
|
+
update!(**args)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Update properties of this object
|
95
|
+
def update!(**args)
|
96
|
+
@next_page_token = args[:next_page_token] if args.key?(:next_page_token)
|
97
|
+
@recommendations = args[:recommendations] if args.key?(:recommendations)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Request for the `MarkRecommendationClaimed` Method.
|
102
|
+
class GoogleCloudRecommenderV1beta1MarkRecommendationClaimedRequest
|
103
|
+
include Google::Apis::Core::Hashable
|
104
|
+
|
105
|
+
# Fingerprint of the Recommendation. Provides optimistic locking.
|
106
|
+
# Corresponds to the JSON property `etag`
|
107
|
+
# @return [String]
|
108
|
+
attr_accessor :etag
|
109
|
+
|
110
|
+
# State properties to include with this state. Overwrites any existing
|
111
|
+
# `state_metadata`.
|
112
|
+
# Corresponds to the JSON property `stateMetadata`
|
113
|
+
# @return [Hash<String,String>]
|
114
|
+
attr_accessor :state_metadata
|
115
|
+
|
116
|
+
def initialize(**args)
|
117
|
+
update!(**args)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Update properties of this object
|
121
|
+
def update!(**args)
|
122
|
+
@etag = args[:etag] if args.key?(:etag)
|
123
|
+
@state_metadata = args[:state_metadata] if args.key?(:state_metadata)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Request for the `MarkRecommendationFailed` Method.
|
128
|
+
class GoogleCloudRecommenderV1beta1MarkRecommendationFailedRequest
|
129
|
+
include Google::Apis::Core::Hashable
|
130
|
+
|
131
|
+
# Fingerprint of the Recommendation. Provides optimistic locking.
|
132
|
+
# Corresponds to the JSON property `etag`
|
133
|
+
# @return [String]
|
134
|
+
attr_accessor :etag
|
135
|
+
|
136
|
+
# State properties to include with this state. Overwrites any existing
|
137
|
+
# `state_metadata`.
|
138
|
+
# Corresponds to the JSON property `stateMetadata`
|
139
|
+
# @return [Hash<String,String>]
|
140
|
+
attr_accessor :state_metadata
|
141
|
+
|
142
|
+
def initialize(**args)
|
143
|
+
update!(**args)
|
144
|
+
end
|
145
|
+
|
146
|
+
# Update properties of this object
|
147
|
+
def update!(**args)
|
148
|
+
@etag = args[:etag] if args.key?(:etag)
|
149
|
+
@state_metadata = args[:state_metadata] if args.key?(:state_metadata)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# Request for the `MarkRecommendationSucceeded` Method.
|
154
|
+
class GoogleCloudRecommenderV1beta1MarkRecommendationSucceededRequest
|
155
|
+
include Google::Apis::Core::Hashable
|
156
|
+
|
157
|
+
# Fingerprint of the Recommendation. Provides optimistic locking.
|
158
|
+
# Corresponds to the JSON property `etag`
|
159
|
+
# @return [String]
|
160
|
+
attr_accessor :etag
|
161
|
+
|
162
|
+
# State properties to include with this state. Overwrites any existing
|
163
|
+
# `state_metadata`.
|
164
|
+
# Corresponds to the JSON property `stateMetadata`
|
165
|
+
# @return [Hash<String,String>]
|
166
|
+
attr_accessor :state_metadata
|
167
|
+
|
168
|
+
def initialize(**args)
|
169
|
+
update!(**args)
|
170
|
+
end
|
171
|
+
|
172
|
+
# Update properties of this object
|
173
|
+
def update!(**args)
|
174
|
+
@etag = args[:etag] if args.key?(:etag)
|
175
|
+
@state_metadata = args[:state_metadata] if args.key?(:state_metadata)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# Contains an operation for a resource loosely based on the JSON-PATCH format
|
180
|
+
# with support for:
|
181
|
+
# * Custom filters for describing partial array patch.
|
182
|
+
# * Extended path values for describing nested arrays.
|
183
|
+
# * Custom fields for describing the resource for which the operation is being
|
184
|
+
# described.
|
185
|
+
# * Allows extension to custom operations not natively supported by RFC6902.
|
186
|
+
# See https://tools.ietf.org/html/rfc6902 for details on the original RFC.
|
187
|
+
class GoogleCloudRecommenderV1beta1Operation
|
188
|
+
include Google::Apis::Core::Hashable
|
189
|
+
|
190
|
+
# Type of this operation. Contains one of 'and', 'remove', 'replace', 'move',
|
191
|
+
# 'copy', 'test' and custom operations. This field is case-insensitive and
|
192
|
+
# always populated.
|
193
|
+
# Corresponds to the JSON property `action`
|
194
|
+
# @return [String]
|
195
|
+
attr_accessor :action
|
196
|
+
|
197
|
+
# Path to the target field being operated on. If the operation is at the
|
198
|
+
# resource level, then path should be "/". This field is always populated.
|
199
|
+
# Corresponds to the JSON property `path`
|
200
|
+
# @return [String]
|
201
|
+
attr_accessor :path
|
202
|
+
|
203
|
+
# Set of filters to apply if `path` refers to array elements or nested array
|
204
|
+
# elements in order to narrow down to a single unique element that is being
|
205
|
+
# tested/modified.
|
206
|
+
# This is intended to be an exact match per filter. To perform advanced
|
207
|
+
# matching, use path_value_matchers.
|
208
|
+
# * Example: `
|
209
|
+
# "/versions/*/name" : "it-123"
|
210
|
+
# "/versions/*/targetSize/percent": 20
|
211
|
+
# `
|
212
|
+
# * Example: `
|
213
|
+
# "/bindings/*/role": "roles/admin"
|
214
|
+
# "/bindings/*/condition" : null
|
215
|
+
# `
|
216
|
+
# * Example: `
|
217
|
+
# "/bindings/*/role": "roles/admin"
|
218
|
+
# "/bindings/*/members/*" : ["x@google.com", "y@google.com"]
|
219
|
+
# `
|
220
|
+
# When both path_filters and path_value_matchers are set, an implicit AND
|
221
|
+
# must be performed.
|
222
|
+
# Corresponds to the JSON property `pathFilters`
|
223
|
+
# @return [Hash<String,Object>]
|
224
|
+
attr_accessor :path_filters
|
225
|
+
|
226
|
+
# Similar to path_filters, this contains set of filters to apply if `path`
|
227
|
+
# field referes to array elements. This is meant to support value matching
|
228
|
+
# beyond exact match. To perform exact match, use path_filters.
|
229
|
+
# When both path_filters and path_value_matchers are set, an implicit AND
|
230
|
+
# must be performed.
|
231
|
+
# Corresponds to the JSON property `pathValueMatchers`
|
232
|
+
# @return [Hash<String,Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1ValueMatcher>]
|
233
|
+
attr_accessor :path_value_matchers
|
234
|
+
|
235
|
+
# Contains the fully qualified resource name. This field is always populated.
|
236
|
+
# ex: //cloudresourcemanager.googleapis.com/projects/foo.
|
237
|
+
# Corresponds to the JSON property `resource`
|
238
|
+
# @return [String]
|
239
|
+
attr_accessor :resource
|
240
|
+
|
241
|
+
# Type of GCP resource being modified/tested. This field is always populated.
|
242
|
+
# Example: cloudresourcemanager.googleapis.com/Project,
|
243
|
+
# compute.googleapis.com/Instance
|
244
|
+
# Corresponds to the JSON property `resourceType`
|
245
|
+
# @return [String]
|
246
|
+
attr_accessor :resource_type
|
247
|
+
|
248
|
+
# Can be set with action 'copy' or 'move' to indicate the source field within
|
249
|
+
# resource or source_resource, ignored if provided for other operation types.
|
250
|
+
# Corresponds to the JSON property `sourcePath`
|
251
|
+
# @return [String]
|
252
|
+
attr_accessor :source_path
|
253
|
+
|
254
|
+
# Can be set with action 'copy' to copy resource configuration across
|
255
|
+
# different resources of the same type. Example: A resource clone can be
|
256
|
+
# done via action = 'copy', path = "/", from = "/",
|
257
|
+
# source_resource = <source> and resource_name = <target>.
|
258
|
+
# This field is empty for all other values of `action`.
|
259
|
+
# Corresponds to the JSON property `sourceResource`
|
260
|
+
# @return [String]
|
261
|
+
attr_accessor :source_resource
|
262
|
+
|
263
|
+
# Value for the `path` field. Will be set for actions:'add'/'replace'.
|
264
|
+
# Maybe set for action: 'test'. Either this or `value_matcher` will be set
|
265
|
+
# for 'test' operation. An exact match must be performed.
|
266
|
+
# Corresponds to the JSON property `value`
|
267
|
+
# @return [Object]
|
268
|
+
attr_accessor :value
|
269
|
+
|
270
|
+
# Contains various matching options for values for a GCP resource field.
|
271
|
+
# Corresponds to the JSON property `valueMatcher`
|
272
|
+
# @return [Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1ValueMatcher]
|
273
|
+
attr_accessor :value_matcher
|
274
|
+
|
275
|
+
def initialize(**args)
|
276
|
+
update!(**args)
|
277
|
+
end
|
278
|
+
|
279
|
+
# Update properties of this object
|
280
|
+
def update!(**args)
|
281
|
+
@action = args[:action] if args.key?(:action)
|
282
|
+
@path = args[:path] if args.key?(:path)
|
283
|
+
@path_filters = args[:path_filters] if args.key?(:path_filters)
|
284
|
+
@path_value_matchers = args[:path_value_matchers] if args.key?(:path_value_matchers)
|
285
|
+
@resource = args[:resource] if args.key?(:resource)
|
286
|
+
@resource_type = args[:resource_type] if args.key?(:resource_type)
|
287
|
+
@source_path = args[:source_path] if args.key?(:source_path)
|
288
|
+
@source_resource = args[:source_resource] if args.key?(:source_resource)
|
289
|
+
@value = args[:value] if args.key?(:value)
|
290
|
+
@value_matcher = args[:value_matcher] if args.key?(:value_matcher)
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
# Group of operations that need to be performed atomically.
|
295
|
+
class GoogleCloudRecommenderV1beta1OperationGroup
|
296
|
+
include Google::Apis::Core::Hashable
|
297
|
+
|
298
|
+
# List of operations across one or more resources that belong to this group.
|
299
|
+
# Loosely based on RFC6902 and should be performed in the order they appear.
|
300
|
+
# Corresponds to the JSON property `operations`
|
301
|
+
# @return [Array<Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1Operation>]
|
302
|
+
attr_accessor :operations
|
303
|
+
|
304
|
+
def initialize(**args)
|
305
|
+
update!(**args)
|
306
|
+
end
|
307
|
+
|
308
|
+
# Update properties of this object
|
309
|
+
def update!(**args)
|
310
|
+
@operations = args[:operations] if args.key?(:operations)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
# A recommendation along with a suggested action. E.g., a rightsizing
|
315
|
+
# recommendation for an underutilized VM, IAM role recommendations, etc
|
316
|
+
class GoogleCloudRecommenderV1beta1Recommendation
|
317
|
+
include Google::Apis::Core::Hashable
|
318
|
+
|
319
|
+
# Optional set of additional impact that this recommendation may have when
|
320
|
+
# trying to optimize for the primary category. These may be positive
|
321
|
+
# or negative.
|
322
|
+
# Corresponds to the JSON property `additionalImpact`
|
323
|
+
# @return [Array<Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1Impact>]
|
324
|
+
attr_accessor :additional_impact
|
325
|
+
|
326
|
+
# Contains what resources are changing and how they are changing.
|
327
|
+
# Corresponds to the JSON property `content`
|
328
|
+
# @return [Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1RecommendationContent]
|
329
|
+
attr_accessor :content
|
330
|
+
|
331
|
+
# Free-form human readable summary in English. The maximum length is 500
|
332
|
+
# characters.
|
333
|
+
# Corresponds to the JSON property `description`
|
334
|
+
# @return [String]
|
335
|
+
attr_accessor :description
|
336
|
+
|
337
|
+
# Fingerprint of the Recommendation. Provides optimistic locking when
|
338
|
+
# updating states.
|
339
|
+
# Corresponds to the JSON property `etag`
|
340
|
+
# @return [String]
|
341
|
+
attr_accessor :etag
|
342
|
+
|
343
|
+
# Last time this recommendation was refreshed by the system that created it
|
344
|
+
# in the first place.
|
345
|
+
# Corresponds to the JSON property `lastRefreshTime`
|
346
|
+
# @return [String]
|
347
|
+
attr_accessor :last_refresh_time
|
348
|
+
|
349
|
+
# Name of recommendation.
|
350
|
+
# A project recommendation is represented as
|
351
|
+
# projects/[PROJECT_NUMBER]/locations/[LOCATION]/recommenders/[RECOMMENDER_ID]/
|
352
|
+
# recommendations/[RECOMMENDATION_ID]
|
353
|
+
# Corresponds to the JSON property `name`
|
354
|
+
# @return [String]
|
355
|
+
attr_accessor :name
|
356
|
+
|
357
|
+
# Contains the impact a recommendation can have for a given category.
|
358
|
+
# Corresponds to the JSON property `primaryImpact`
|
359
|
+
# @return [Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1Impact]
|
360
|
+
attr_accessor :primary_impact
|
361
|
+
|
362
|
+
# Contains an identifier for a subtype of recommendations produced for the
|
363
|
+
# same recommender. Subtype is a function of content and impact, meaning a
|
364
|
+
# new subtype might be added when significant changes to `content` or
|
365
|
+
# `primary_impact.category` are introduced. See the Recommenders section
|
366
|
+
# to see a list of subtypes for a given Recommender.
|
367
|
+
# Examples:
|
368
|
+
# For recommender = "google.iam.policy.Recommender",
|
369
|
+
# recommender_subtype can be one of "REMOVE_ROLE"/"REPLACE_ROLE"
|
370
|
+
# Corresponds to the JSON property `recommenderSubtype`
|
371
|
+
# @return [String]
|
372
|
+
attr_accessor :recommender_subtype
|
373
|
+
|
374
|
+
# Information for state. Contains state and metadata.
|
375
|
+
# Corresponds to the JSON property `stateInfo`
|
376
|
+
# @return [Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1RecommendationStateInfo]
|
377
|
+
attr_accessor :state_info
|
378
|
+
|
379
|
+
def initialize(**args)
|
380
|
+
update!(**args)
|
381
|
+
end
|
382
|
+
|
383
|
+
# Update properties of this object
|
384
|
+
def update!(**args)
|
385
|
+
@additional_impact = args[:additional_impact] if args.key?(:additional_impact)
|
386
|
+
@content = args[:content] if args.key?(:content)
|
387
|
+
@description = args[:description] if args.key?(:description)
|
388
|
+
@etag = args[:etag] if args.key?(:etag)
|
389
|
+
@last_refresh_time = args[:last_refresh_time] if args.key?(:last_refresh_time)
|
390
|
+
@name = args[:name] if args.key?(:name)
|
391
|
+
@primary_impact = args[:primary_impact] if args.key?(:primary_impact)
|
392
|
+
@recommender_subtype = args[:recommender_subtype] if args.key?(:recommender_subtype)
|
393
|
+
@state_info = args[:state_info] if args.key?(:state_info)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
# Contains what resources are changing and how they are changing.
|
398
|
+
class GoogleCloudRecommenderV1beta1RecommendationContent
|
399
|
+
include Google::Apis::Core::Hashable
|
400
|
+
|
401
|
+
# Operations to one or more Google Cloud resources grouped in such a way
|
402
|
+
# that, all operations within one group are expected to be performed
|
403
|
+
# atomically and in an order.
|
404
|
+
# Corresponds to the JSON property `operationGroups`
|
405
|
+
# @return [Array<Google::Apis::RecommenderV1beta1::GoogleCloudRecommenderV1beta1OperationGroup>]
|
406
|
+
attr_accessor :operation_groups
|
407
|
+
|
408
|
+
def initialize(**args)
|
409
|
+
update!(**args)
|
410
|
+
end
|
411
|
+
|
412
|
+
# Update properties of this object
|
413
|
+
def update!(**args)
|
414
|
+
@operation_groups = args[:operation_groups] if args.key?(:operation_groups)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
# Information for state. Contains state and metadata.
|
419
|
+
class GoogleCloudRecommenderV1beta1RecommendationStateInfo
|
420
|
+
include Google::Apis::Core::Hashable
|
421
|
+
|
422
|
+
# The state of the recommendation, Eg ACTIVE, SUCCEEDED, FAILED.
|
423
|
+
# Corresponds to the JSON property `state`
|
424
|
+
# @return [String]
|
425
|
+
attr_accessor :state
|
426
|
+
|
427
|
+
# A map of metadata for the state, provided by user or automations systems.
|
428
|
+
# Corresponds to the JSON property `stateMetadata`
|
429
|
+
# @return [Hash<String,String>]
|
430
|
+
attr_accessor :state_metadata
|
431
|
+
|
432
|
+
def initialize(**args)
|
433
|
+
update!(**args)
|
434
|
+
end
|
435
|
+
|
436
|
+
# Update properties of this object
|
437
|
+
def update!(**args)
|
438
|
+
@state = args[:state] if args.key?(:state)
|
439
|
+
@state_metadata = args[:state_metadata] if args.key?(:state_metadata)
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
# Contains various matching options for values for a GCP resource field.
|
444
|
+
class GoogleCloudRecommenderV1beta1ValueMatcher
|
445
|
+
include Google::Apis::Core::Hashable
|
446
|
+
|
447
|
+
# To be used for full regex matching. The regular expression is using the
|
448
|
+
# Google RE2 syntax (https://github.com/google/re2/wiki/Syntax), so to be
|
449
|
+
# used with RE2::FullMatch
|
450
|
+
# Corresponds to the JSON property `matchesPattern`
|
451
|
+
# @return [String]
|
452
|
+
attr_accessor :matches_pattern
|
453
|
+
|
454
|
+
def initialize(**args)
|
455
|
+
update!(**args)
|
456
|
+
end
|
457
|
+
|
458
|
+
# Update properties of this object
|
459
|
+
def update!(**args)
|
460
|
+
@matches_pattern = args[:matches_pattern] if args.key?(:matches_pattern)
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
# Represents an amount of money with its currency type.
|
465
|
+
class GoogleTypeMoney
|
466
|
+
include Google::Apis::Core::Hashable
|
467
|
+
|
468
|
+
# The 3-letter currency code defined in ISO 4217.
|
469
|
+
# Corresponds to the JSON property `currencyCode`
|
470
|
+
# @return [String]
|
471
|
+
attr_accessor :currency_code
|
472
|
+
|
473
|
+
# Number of nano (10^-9) units of the amount.
|
474
|
+
# The value must be between -999,999,999 and +999,999,999 inclusive.
|
475
|
+
# If `units` is positive, `nanos` must be positive or zero.
|
476
|
+
# If `units` is zero, `nanos` can be positive, zero, or negative.
|
477
|
+
# If `units` is negative, `nanos` must be negative or zero.
|
478
|
+
# For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
|
479
|
+
# Corresponds to the JSON property `nanos`
|
480
|
+
# @return [Fixnum]
|
481
|
+
attr_accessor :nanos
|
482
|
+
|
483
|
+
# The whole units of the amount.
|
484
|
+
# For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
|
485
|
+
# Corresponds to the JSON property `units`
|
486
|
+
# @return [Fixnum]
|
487
|
+
attr_accessor :units
|
488
|
+
|
489
|
+
def initialize(**args)
|
490
|
+
update!(**args)
|
491
|
+
end
|
492
|
+
|
493
|
+
# Update properties of this object
|
494
|
+
def update!(**args)
|
495
|
+
@currency_code = args[:currency_code] if args.key?(:currency_code)
|
496
|
+
@nanos = args[:nanos] if args.key?(:nanos)
|
497
|
+
@units = args[:units] if args.key?(:units)
|
498
|
+
end
|
499
|
+
end
|
500
|
+
end
|
501
|
+
end
|
502
|
+
end
|