diff --git a/generated/googleapis/test/ml/v1_test.dart b/generated/googleapis/test/ml/v1_test.dart
index 425de13..3d310a3 100644
--- a/generated/googleapis/test/ml/v1_test.dart
+++ b/generated/googleapis/test/ml/v1_test.dart
@@ -27,7 +27,7 @@
 
 import '../test_shared.dart';
 
-core.Map<core.String, core.Object> buildUnnamed5545() {
+core.Map<core.String, core.Object> buildUnnamed6431() {
   var o = <core.String, core.Object>{};
   o['x'] = {
     'list': [1, 2, 3],
@@ -42,7 +42,7 @@
   return o;
 }
 
-void checkUnnamed5545(core.Map<core.String, core.Object> o) {
+void checkUnnamed6431(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o['x']) as core.Map;
   unittest.expect(casted1, unittest.hasLength(3));
@@ -56,17 +56,17 @@
   unittest.expect(casted2['string'], unittest.equals('foo'));
 }
 
-core.List<core.Map<core.String, core.Object>> buildUnnamed5546() {
+core.List<core.Map<core.String, core.Object>> buildUnnamed6432() {
   var o = <core.Map<core.String, core.Object>>[];
-  o.add(buildUnnamed5545());
-  o.add(buildUnnamed5545());
+  o.add(buildUnnamed6431());
+  o.add(buildUnnamed6431());
   return o;
 }
 
-void checkUnnamed5546(core.List<core.Map<core.String, core.Object>> o) {
+void checkUnnamed6432(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed5545(o[0]);
-  checkUnnamed5545(o[1]);
+  checkUnnamed6431(o[0]);
+  checkUnnamed6431(o[1]);
 }
 
 core.int buildCounterGoogleApiHttpBody = 0;
@@ -76,7 +76,7 @@
   if (buildCounterGoogleApiHttpBody < 3) {
     o.contentType = 'foo';
     o.data = 'foo';
-    o.extensions = buildUnnamed5546();
+    o.extensions = buildUnnamed6432();
   }
   buildCounterGoogleApiHttpBody--;
   return o;
@@ -87,7 +87,7 @@
   if (buildCounterGoogleApiHttpBody < 3) {
     unittest.expect(o.contentType, unittest.equals('foo'));
     unittest.expect(o.data, unittest.equals('foo'));
-    checkUnnamed5546(o.extensions);
+    checkUnnamed6432(o.extensions);
   }
   buildCounterGoogleApiHttpBody--;
 }
@@ -191,14 +191,14 @@
   buildCounterGoogleCloudMlV1MeasurementMetric--;
 }
 
-core.List<core.String> buildUnnamed5547() {
+core.List<core.String> buildUnnamed6433() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5547(core.List<core.String> o) {
+void checkUnnamed6433(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -212,7 +212,7 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec <
       3) {
-    o.values = buildUnnamed5547();
+    o.values = buildUnnamed6433();
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec--;
   return o;
@@ -223,19 +223,19 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec <
       3) {
-    checkUnnamed5547(o.values);
+    checkUnnamed6433(o.values);
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec--;
 }
 
-core.List<core.double> buildUnnamed5548() {
+core.List<core.double> buildUnnamed6434() {
   var o = <core.double>[];
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-void checkUnnamed5548(core.List<core.double> o) {
+void checkUnnamed6434(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -249,7 +249,7 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec <
       3) {
-    o.values = buildUnnamed5548();
+    o.values = buildUnnamed6434();
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec--;
   return o;
@@ -260,7 +260,7 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec <
       3) {
-    checkUnnamed5548(o.values);
+    checkUnnamed6434(o.values);
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec--;
 }
@@ -312,14 +312,14 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec--;
 }
 
-core.List<core.String> buildUnnamed5549() {
+core.List<core.String> buildUnnamed6435() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5549(core.List<core.String> o) {
+void checkUnnamed6435(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -335,7 +335,7 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec <
       3) {
-    o.values = buildUnnamed5549();
+    o.values = buildUnnamed6435();
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec--;
   return o;
@@ -347,19 +347,19 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec <
       3) {
-    checkUnnamed5549(o.values);
+    checkUnnamed6435(o.values);
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec--;
 }
 
-core.List<core.double> buildUnnamed5550() {
+core.List<core.double> buildUnnamed6436() {
   var o = <core.double>[];
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-void checkUnnamed5550(core.List<core.double> o) {
+void checkUnnamed6436(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -375,7 +375,7 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec <
       3) {
-    o.values = buildUnnamed5550();
+    o.values = buildUnnamed6436();
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec--;
   return o;
@@ -387,19 +387,19 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec <
       3) {
-    checkUnnamed5550(o.values);
+    checkUnnamed6436(o.values);
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec--;
 }
 
-core.List<core.String> buildUnnamed5551() {
+core.List<core.String> buildUnnamed6437() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5551(core.List<core.String> o) {
+void checkUnnamed6437(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -415,7 +415,7 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec <
       3) {
-    o.values = buildUnnamed5551();
+    o.values = buildUnnamed6437();
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec--;
   return o;
@@ -426,7 +426,7 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec <
       3) {
-    checkUnnamed5551(o.values);
+    checkUnnamed6437(o.values);
   }
   buildCounterGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec--;
 }
@@ -454,14 +454,14 @@
   buildCounterGoogleCloudMlV1StudyConfigMetricSpec--;
 }
 
-core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> buildUnnamed5552() {
+core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> buildUnnamed6438() {
   var o = <api.GoogleCloudMlV1StudyConfigParameterSpec>[];
   o.add(buildGoogleCloudMlV1StudyConfigParameterSpec());
   o.add(buildGoogleCloudMlV1StudyConfigParameterSpec());
   return o;
 }
 
-void checkUnnamed5552(
+void checkUnnamed6438(
     core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1StudyConfigParameterSpec(
@@ -478,7 +478,7 @@
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpec < 3) {
     o.categoricalValueSpec =
         buildGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec();
-    o.childParameterSpecs = buildUnnamed5552();
+    o.childParameterSpecs = buildUnnamed6438();
     o.discreteValueSpec =
         buildGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec();
     o.doubleValueSpec =
@@ -506,7 +506,7 @@
     checkGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec(
         o.categoricalValueSpec
             as api.GoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec);
-    checkUnnamed5552(o.childParameterSpecs);
+    checkUnnamed6438(o.childParameterSpecs);
     checkGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec(
         o.discreteValueSpec
             as api.GoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec);
@@ -601,11 +601,26 @@
   buildCounterGoogleCloudMlV1AddTrialMeasurementRequest--;
 }
 
+core.List<api.GoogleCloudMlV1MetricSpec> buildUnnamed6439() {
+  var o = <api.GoogleCloudMlV1MetricSpec>[];
+  o.add(buildGoogleCloudMlV1MetricSpec());
+  o.add(buildGoogleCloudMlV1MetricSpec());
+  return o;
+}
+
+void checkUnnamed6439(core.List<api.GoogleCloudMlV1MetricSpec> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkGoogleCloudMlV1MetricSpec(o[0] as api.GoogleCloudMlV1MetricSpec);
+  checkGoogleCloudMlV1MetricSpec(o[1] as api.GoogleCloudMlV1MetricSpec);
+}
+
 core.int buildCounterGoogleCloudMlV1AutoScaling = 0;
 api.GoogleCloudMlV1AutoScaling buildGoogleCloudMlV1AutoScaling() {
   var o = api.GoogleCloudMlV1AutoScaling();
   buildCounterGoogleCloudMlV1AutoScaling++;
   if (buildCounterGoogleCloudMlV1AutoScaling < 3) {
+    o.maxNodes = 42;
+    o.metrics = buildUnnamed6439();
     o.minNodes = 42;
   }
   buildCounterGoogleCloudMlV1AutoScaling--;
@@ -615,6 +630,8 @@
 void checkGoogleCloudMlV1AutoScaling(api.GoogleCloudMlV1AutoScaling o) {
   buildCounterGoogleCloudMlV1AutoScaling++;
   if (buildCounterGoogleCloudMlV1AutoScaling < 3) {
+    unittest.expect(o.maxNodes, unittest.equals(42));
+    checkUnnamed6439(o.metrics);
     unittest.expect(o.minNodes, unittest.equals(42));
   }
   buildCounterGoogleCloudMlV1AutoScaling--;
@@ -692,14 +709,14 @@
   buildCounterGoogleCloudMlV1CancelJobRequest--;
 }
 
-core.List<core.String> buildUnnamed5553() {
+core.List<core.String> buildUnnamed6440() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5553(core.List<core.String> o) {
+void checkUnnamed6440(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -710,7 +727,7 @@
   var o = api.GoogleCloudMlV1Capability();
   buildCounterGoogleCloudMlV1Capability++;
   if (buildCounterGoogleCloudMlV1Capability < 3) {
-    o.availableAccelerators = buildUnnamed5553();
+    o.availableAccelerators = buildUnnamed6440();
     o.type = 'foo';
   }
   buildCounterGoogleCloudMlV1Capability--;
@@ -720,7 +737,7 @@
 void checkGoogleCloudMlV1Capability(api.GoogleCloudMlV1Capability o) {
   buildCounterGoogleCloudMlV1Capability++;
   if (buildCounterGoogleCloudMlV1Capability < 3) {
-    checkUnnamed5553(o.availableAccelerators);
+    checkUnnamed6440(o.availableAccelerators);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1Capability--;
@@ -857,53 +874,53 @@
   buildCounterGoogleCloudMlV1ContainerPort--;
 }
 
-core.List<core.String> buildUnnamed5554() {
+core.List<core.String> buildUnnamed6441() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5554(core.List<core.String> o) {
+void checkUnnamed6441(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.List<core.String> buildUnnamed5555() {
+core.List<core.String> buildUnnamed6442() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5555(core.List<core.String> o) {
+void checkUnnamed6442(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.List<api.GoogleCloudMlV1EnvVar> buildUnnamed5556() {
+core.List<api.GoogleCloudMlV1EnvVar> buildUnnamed6443() {
   var o = <api.GoogleCloudMlV1EnvVar>[];
   o.add(buildGoogleCloudMlV1EnvVar());
   o.add(buildGoogleCloudMlV1EnvVar());
   return o;
 }
 
-void checkUnnamed5556(core.List<api.GoogleCloudMlV1EnvVar> o) {
+void checkUnnamed6443(core.List<api.GoogleCloudMlV1EnvVar> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1EnvVar(o[0] as api.GoogleCloudMlV1EnvVar);
   checkGoogleCloudMlV1EnvVar(o[1] as api.GoogleCloudMlV1EnvVar);
 }
 
-core.List<api.GoogleCloudMlV1ContainerPort> buildUnnamed5557() {
+core.List<api.GoogleCloudMlV1ContainerPort> buildUnnamed6444() {
   var o = <api.GoogleCloudMlV1ContainerPort>[];
   o.add(buildGoogleCloudMlV1ContainerPort());
   o.add(buildGoogleCloudMlV1ContainerPort());
   return o;
 }
 
-void checkUnnamed5557(core.List<api.GoogleCloudMlV1ContainerPort> o) {
+void checkUnnamed6444(core.List<api.GoogleCloudMlV1ContainerPort> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1ContainerPort(o[0] as api.GoogleCloudMlV1ContainerPort);
   checkGoogleCloudMlV1ContainerPort(o[1] as api.GoogleCloudMlV1ContainerPort);
@@ -914,11 +931,11 @@
   var o = api.GoogleCloudMlV1ContainerSpec();
   buildCounterGoogleCloudMlV1ContainerSpec++;
   if (buildCounterGoogleCloudMlV1ContainerSpec < 3) {
-    o.args = buildUnnamed5554();
-    o.command = buildUnnamed5555();
-    o.env = buildUnnamed5556();
+    o.args = buildUnnamed6441();
+    o.command = buildUnnamed6442();
+    o.env = buildUnnamed6443();
     o.image = 'foo';
-    o.ports = buildUnnamed5557();
+    o.ports = buildUnnamed6444();
   }
   buildCounterGoogleCloudMlV1ContainerSpec--;
   return o;
@@ -927,15 +944,36 @@
 void checkGoogleCloudMlV1ContainerSpec(api.GoogleCloudMlV1ContainerSpec o) {
   buildCounterGoogleCloudMlV1ContainerSpec++;
   if (buildCounterGoogleCloudMlV1ContainerSpec < 3) {
-    checkUnnamed5554(o.args);
-    checkUnnamed5555(o.command);
-    checkUnnamed5556(o.env);
+    checkUnnamed6441(o.args);
+    checkUnnamed6442(o.command);
+    checkUnnamed6443(o.env);
     unittest.expect(o.image, unittest.equals('foo'));
-    checkUnnamed5557(o.ports);
+    checkUnnamed6444(o.ports);
   }
   buildCounterGoogleCloudMlV1ContainerSpec--;
 }
 
+core.int buildCounterGoogleCloudMlV1DiskConfig = 0;
+api.GoogleCloudMlV1DiskConfig buildGoogleCloudMlV1DiskConfig() {
+  var o = api.GoogleCloudMlV1DiskConfig();
+  buildCounterGoogleCloudMlV1DiskConfig++;
+  if (buildCounterGoogleCloudMlV1DiskConfig < 3) {
+    o.bootDiskSizeGb = 42;
+    o.bootDiskType = 'foo';
+  }
+  buildCounterGoogleCloudMlV1DiskConfig--;
+  return o;
+}
+
+void checkGoogleCloudMlV1DiskConfig(api.GoogleCloudMlV1DiskConfig o) {
+  buildCounterGoogleCloudMlV1DiskConfig++;
+  if (buildCounterGoogleCloudMlV1DiskConfig < 3) {
+    unittest.expect(o.bootDiskSizeGb, unittest.equals(42));
+    unittest.expect(o.bootDiskType, unittest.equals('foo'));
+  }
+  buildCounterGoogleCloudMlV1DiskConfig--;
+}
+
 core.int buildCounterGoogleCloudMlV1EncryptionConfig = 0;
 api.GoogleCloudMlV1EncryptionConfig buildGoogleCloudMlV1EncryptionConfig() {
   var o = api.GoogleCloudMlV1EncryptionConfig();
@@ -1051,14 +1089,14 @@
 }
 
 core.List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric>
-    buildUnnamed5558() {
+    buildUnnamed6445() {
   var o = <api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric>[];
   o.add(buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric());
   o.add(buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric());
   return o;
 }
 
-void checkUnnamed5558(
+void checkUnnamed6445(
     core.List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(
@@ -1067,14 +1105,14 @@
       o[1] as api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric);
 }
 
-core.Map<core.String, core.String> buildUnnamed5559() {
+core.Map<core.String, core.String> buildUnnamed6446() {
   var o = <core.String, core.String>{};
   o['x'] = 'foo';
   o['y'] = 'foo';
   return o;
 }
 
-void checkUnnamed5559(core.Map<core.String, core.String> o) {
+void checkUnnamed6446(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o['x'], unittest.equals('foo'));
   unittest.expect(o['y'], unittest.equals('foo'));
@@ -1086,12 +1124,12 @@
   var o = api.GoogleCloudMlV1HyperparameterOutput();
   buildCounterGoogleCloudMlV1HyperparameterOutput++;
   if (buildCounterGoogleCloudMlV1HyperparameterOutput < 3) {
-    o.allMetrics = buildUnnamed5558();
+    o.allMetrics = buildUnnamed6445();
     o.builtInAlgorithmOutput = buildGoogleCloudMlV1BuiltInAlgorithmOutput();
     o.endTime = 'foo';
     o.finalMetric =
         buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric();
-    o.hyperparameters = buildUnnamed5559();
+    o.hyperparameters = buildUnnamed6446();
     o.isTrialStoppedEarly = true;
     o.startTime = 'foo';
     o.state = 'foo';
@@ -1105,13 +1143,13 @@
     api.GoogleCloudMlV1HyperparameterOutput o) {
   buildCounterGoogleCloudMlV1HyperparameterOutput++;
   if (buildCounterGoogleCloudMlV1HyperparameterOutput < 3) {
-    checkUnnamed5558(o.allMetrics);
+    checkUnnamed6445(o.allMetrics);
     checkGoogleCloudMlV1BuiltInAlgorithmOutput(
         o.builtInAlgorithmOutput as api.GoogleCloudMlV1BuiltInAlgorithmOutput);
     unittest.expect(o.endTime, unittest.equals('foo'));
     checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o.finalMetric
         as api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric);
-    checkUnnamed5559(o.hyperparameters);
+    checkUnnamed6446(o.hyperparameters);
     unittest.expect(o.isTrialStoppedEarly, unittest.isTrue);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -1120,14 +1158,14 @@
   buildCounterGoogleCloudMlV1HyperparameterOutput--;
 }
 
-core.List<api.GoogleCloudMlV1ParameterSpec> buildUnnamed5560() {
+core.List<api.GoogleCloudMlV1ParameterSpec> buildUnnamed6447() {
   var o = <api.GoogleCloudMlV1ParameterSpec>[];
   o.add(buildGoogleCloudMlV1ParameterSpec());
   o.add(buildGoogleCloudMlV1ParameterSpec());
   return o;
 }
 
-void checkUnnamed5560(core.List<api.GoogleCloudMlV1ParameterSpec> o) {
+void checkUnnamed6447(core.List<api.GoogleCloudMlV1ParameterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1ParameterSpec(o[0] as api.GoogleCloudMlV1ParameterSpec);
   checkGoogleCloudMlV1ParameterSpec(o[1] as api.GoogleCloudMlV1ParameterSpec);
@@ -1145,7 +1183,7 @@
     o.maxFailedTrials = 42;
     o.maxParallelTrials = 42;
     o.maxTrials = 42;
-    o.params = buildUnnamed5560();
+    o.params = buildUnnamed6447();
     o.resumePreviousJobId = 'foo';
   }
   buildCounterGoogleCloudMlV1HyperparameterSpec--;
@@ -1163,7 +1201,7 @@
     unittest.expect(o.maxFailedTrials, unittest.equals(42));
     unittest.expect(o.maxParallelTrials, unittest.equals(42));
     unittest.expect(o.maxTrials, unittest.equals(42));
-    checkUnnamed5560(o.params);
+    checkUnnamed6447(o.params);
     unittest.expect(o.resumePreviousJobId, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1HyperparameterSpec--;
@@ -1190,14 +1228,14 @@
   buildCounterGoogleCloudMlV1IntegratedGradientsAttribution--;
 }
 
-core.Map<core.String, core.String> buildUnnamed5561() {
+core.Map<core.String, core.String> buildUnnamed6448() {
   var o = <core.String, core.String>{};
   o['x'] = 'foo';
   o['y'] = 'foo';
   return o;
 }
 
-void checkUnnamed5561(core.Map<core.String, core.String> o) {
+void checkUnnamed6448(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o['x'], unittest.equals('foo'));
   unittest.expect(o['y'], unittest.equals('foo'));
@@ -1213,7 +1251,7 @@
     o.errorMessage = 'foo';
     o.etag = 'foo';
     o.jobId = 'foo';
-    o.labels = buildUnnamed5561();
+    o.labels = buildUnnamed6448();
     o.predictionInput = buildGoogleCloudMlV1PredictionInput();
     o.predictionOutput = buildGoogleCloudMlV1PredictionOutput();
     o.startTime = 'foo';
@@ -1233,7 +1271,7 @@
     unittest.expect(o.errorMessage, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.jobId, unittest.equals('foo'));
-    checkUnnamed5561(o.labels);
+    checkUnnamed6448(o.labels);
     checkGoogleCloudMlV1PredictionInput(
         o.predictionInput as api.GoogleCloudMlV1PredictionInput);
     checkGoogleCloudMlV1PredictionOutput(
@@ -1248,14 +1286,14 @@
   buildCounterGoogleCloudMlV1Job--;
 }
 
-core.List<api.GoogleCloudMlV1Job> buildUnnamed5562() {
+core.List<api.GoogleCloudMlV1Job> buildUnnamed6449() {
   var o = <api.GoogleCloudMlV1Job>[];
   o.add(buildGoogleCloudMlV1Job());
   o.add(buildGoogleCloudMlV1Job());
   return o;
 }
 
-void checkUnnamed5562(core.List<api.GoogleCloudMlV1Job> o) {
+void checkUnnamed6449(core.List<api.GoogleCloudMlV1Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Job(o[0] as api.GoogleCloudMlV1Job);
   checkGoogleCloudMlV1Job(o[1] as api.GoogleCloudMlV1Job);
@@ -1266,7 +1304,7 @@
   var o = api.GoogleCloudMlV1ListJobsResponse();
   buildCounterGoogleCloudMlV1ListJobsResponse++;
   if (buildCounterGoogleCloudMlV1ListJobsResponse < 3) {
-    o.jobs = buildUnnamed5562();
+    o.jobs = buildUnnamed6449();
     o.nextPageToken = 'foo';
   }
   buildCounterGoogleCloudMlV1ListJobsResponse--;
@@ -1277,20 +1315,20 @@
     api.GoogleCloudMlV1ListJobsResponse o) {
   buildCounterGoogleCloudMlV1ListJobsResponse++;
   if (buildCounterGoogleCloudMlV1ListJobsResponse < 3) {
-    checkUnnamed5562(o.jobs);
+    checkUnnamed6449(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1ListJobsResponse--;
 }
 
-core.List<api.GoogleCloudMlV1Location> buildUnnamed5563() {
+core.List<api.GoogleCloudMlV1Location> buildUnnamed6450() {
   var o = <api.GoogleCloudMlV1Location>[];
   o.add(buildGoogleCloudMlV1Location());
   o.add(buildGoogleCloudMlV1Location());
   return o;
 }
 
-void checkUnnamed5563(core.List<api.GoogleCloudMlV1Location> o) {
+void checkUnnamed6450(core.List<api.GoogleCloudMlV1Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Location(o[0] as api.GoogleCloudMlV1Location);
   checkGoogleCloudMlV1Location(o[1] as api.GoogleCloudMlV1Location);
@@ -1302,7 +1340,7 @@
   var o = api.GoogleCloudMlV1ListLocationsResponse();
   buildCounterGoogleCloudMlV1ListLocationsResponse++;
   if (buildCounterGoogleCloudMlV1ListLocationsResponse < 3) {
-    o.locations = buildUnnamed5563();
+    o.locations = buildUnnamed6450();
     o.nextPageToken = 'foo';
   }
   buildCounterGoogleCloudMlV1ListLocationsResponse--;
@@ -1313,20 +1351,20 @@
     api.GoogleCloudMlV1ListLocationsResponse o) {
   buildCounterGoogleCloudMlV1ListLocationsResponse++;
   if (buildCounterGoogleCloudMlV1ListLocationsResponse < 3) {
-    checkUnnamed5563(o.locations);
+    checkUnnamed6450(o.locations);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1ListLocationsResponse--;
 }
 
-core.List<api.GoogleCloudMlV1Model> buildUnnamed5564() {
+core.List<api.GoogleCloudMlV1Model> buildUnnamed6451() {
   var o = <api.GoogleCloudMlV1Model>[];
   o.add(buildGoogleCloudMlV1Model());
   o.add(buildGoogleCloudMlV1Model());
   return o;
 }
 
-void checkUnnamed5564(core.List<api.GoogleCloudMlV1Model> o) {
+void checkUnnamed6451(core.List<api.GoogleCloudMlV1Model> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Model(o[0] as api.GoogleCloudMlV1Model);
   checkGoogleCloudMlV1Model(o[1] as api.GoogleCloudMlV1Model);
@@ -1337,7 +1375,7 @@
   var o = api.GoogleCloudMlV1ListModelsResponse();
   buildCounterGoogleCloudMlV1ListModelsResponse++;
   if (buildCounterGoogleCloudMlV1ListModelsResponse < 3) {
-    o.models = buildUnnamed5564();
+    o.models = buildUnnamed6451();
     o.nextPageToken = 'foo';
   }
   buildCounterGoogleCloudMlV1ListModelsResponse--;
@@ -1348,20 +1386,71 @@
     api.GoogleCloudMlV1ListModelsResponse o) {
   buildCounterGoogleCloudMlV1ListModelsResponse++;
   if (buildCounterGoogleCloudMlV1ListModelsResponse < 3) {
-    checkUnnamed5564(o.models);
+    checkUnnamed6451(o.models);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1ListModelsResponse--;
 }
 
-core.List<api.GoogleCloudMlV1Study> buildUnnamed5565() {
+core.int buildCounterGoogleCloudMlV1ListOptimalTrialsRequest = 0;
+api.GoogleCloudMlV1ListOptimalTrialsRequest
+    buildGoogleCloudMlV1ListOptimalTrialsRequest() {
+  var o = api.GoogleCloudMlV1ListOptimalTrialsRequest();
+  buildCounterGoogleCloudMlV1ListOptimalTrialsRequest++;
+  if (buildCounterGoogleCloudMlV1ListOptimalTrialsRequest < 3) {}
+  buildCounterGoogleCloudMlV1ListOptimalTrialsRequest--;
+  return o;
+}
+
+void checkGoogleCloudMlV1ListOptimalTrialsRequest(
+    api.GoogleCloudMlV1ListOptimalTrialsRequest o) {
+  buildCounterGoogleCloudMlV1ListOptimalTrialsRequest++;
+  if (buildCounterGoogleCloudMlV1ListOptimalTrialsRequest < 3) {}
+  buildCounterGoogleCloudMlV1ListOptimalTrialsRequest--;
+}
+
+core.List<api.GoogleCloudMlV1Trial> buildUnnamed6452() {
+  var o = <api.GoogleCloudMlV1Trial>[];
+  o.add(buildGoogleCloudMlV1Trial());
+  o.add(buildGoogleCloudMlV1Trial());
+  return o;
+}
+
+void checkUnnamed6452(core.List<api.GoogleCloudMlV1Trial> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkGoogleCloudMlV1Trial(o[0] as api.GoogleCloudMlV1Trial);
+  checkGoogleCloudMlV1Trial(o[1] as api.GoogleCloudMlV1Trial);
+}
+
+core.int buildCounterGoogleCloudMlV1ListOptimalTrialsResponse = 0;
+api.GoogleCloudMlV1ListOptimalTrialsResponse
+    buildGoogleCloudMlV1ListOptimalTrialsResponse() {
+  var o = api.GoogleCloudMlV1ListOptimalTrialsResponse();
+  buildCounterGoogleCloudMlV1ListOptimalTrialsResponse++;
+  if (buildCounterGoogleCloudMlV1ListOptimalTrialsResponse < 3) {
+    o.trials = buildUnnamed6452();
+  }
+  buildCounterGoogleCloudMlV1ListOptimalTrialsResponse--;
+  return o;
+}
+
+void checkGoogleCloudMlV1ListOptimalTrialsResponse(
+    api.GoogleCloudMlV1ListOptimalTrialsResponse o) {
+  buildCounterGoogleCloudMlV1ListOptimalTrialsResponse++;
+  if (buildCounterGoogleCloudMlV1ListOptimalTrialsResponse < 3) {
+    checkUnnamed6452(o.trials);
+  }
+  buildCounterGoogleCloudMlV1ListOptimalTrialsResponse--;
+}
+
+core.List<api.GoogleCloudMlV1Study> buildUnnamed6453() {
   var o = <api.GoogleCloudMlV1Study>[];
   o.add(buildGoogleCloudMlV1Study());
   o.add(buildGoogleCloudMlV1Study());
   return o;
 }
 
-void checkUnnamed5565(core.List<api.GoogleCloudMlV1Study> o) {
+void checkUnnamed6453(core.List<api.GoogleCloudMlV1Study> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Study(o[0] as api.GoogleCloudMlV1Study);
   checkGoogleCloudMlV1Study(o[1] as api.GoogleCloudMlV1Study);
@@ -1373,7 +1462,7 @@
   var o = api.GoogleCloudMlV1ListStudiesResponse();
   buildCounterGoogleCloudMlV1ListStudiesResponse++;
   if (buildCounterGoogleCloudMlV1ListStudiesResponse < 3) {
-    o.studies = buildUnnamed5565();
+    o.studies = buildUnnamed6453();
   }
   buildCounterGoogleCloudMlV1ListStudiesResponse--;
   return o;
@@ -1383,19 +1472,19 @@
     api.GoogleCloudMlV1ListStudiesResponse o) {
   buildCounterGoogleCloudMlV1ListStudiesResponse++;
   if (buildCounterGoogleCloudMlV1ListStudiesResponse < 3) {
-    checkUnnamed5565(o.studies);
+    checkUnnamed6453(o.studies);
   }
   buildCounterGoogleCloudMlV1ListStudiesResponse--;
 }
 
-core.List<api.GoogleCloudMlV1Trial> buildUnnamed5566() {
+core.List<api.GoogleCloudMlV1Trial> buildUnnamed6454() {
   var o = <api.GoogleCloudMlV1Trial>[];
   o.add(buildGoogleCloudMlV1Trial());
   o.add(buildGoogleCloudMlV1Trial());
   return o;
 }
 
-void checkUnnamed5566(core.List<api.GoogleCloudMlV1Trial> o) {
+void checkUnnamed6454(core.List<api.GoogleCloudMlV1Trial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Trial(o[0] as api.GoogleCloudMlV1Trial);
   checkGoogleCloudMlV1Trial(o[1] as api.GoogleCloudMlV1Trial);
@@ -1406,7 +1495,7 @@
   var o = api.GoogleCloudMlV1ListTrialsResponse();
   buildCounterGoogleCloudMlV1ListTrialsResponse++;
   if (buildCounterGoogleCloudMlV1ListTrialsResponse < 3) {
-    o.trials = buildUnnamed5566();
+    o.trials = buildUnnamed6454();
   }
   buildCounterGoogleCloudMlV1ListTrialsResponse--;
   return o;
@@ -1416,19 +1505,19 @@
     api.GoogleCloudMlV1ListTrialsResponse o) {
   buildCounterGoogleCloudMlV1ListTrialsResponse++;
   if (buildCounterGoogleCloudMlV1ListTrialsResponse < 3) {
-    checkUnnamed5566(o.trials);
+    checkUnnamed6454(o.trials);
   }
   buildCounterGoogleCloudMlV1ListTrialsResponse--;
 }
 
-core.List<api.GoogleCloudMlV1Version> buildUnnamed5567() {
+core.List<api.GoogleCloudMlV1Version> buildUnnamed6455() {
   var o = <api.GoogleCloudMlV1Version>[];
   o.add(buildGoogleCloudMlV1Version());
   o.add(buildGoogleCloudMlV1Version());
   return o;
 }
 
-void checkUnnamed5567(core.List<api.GoogleCloudMlV1Version> o) {
+void checkUnnamed6455(core.List<api.GoogleCloudMlV1Version> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Version(o[0] as api.GoogleCloudMlV1Version);
   checkGoogleCloudMlV1Version(o[1] as api.GoogleCloudMlV1Version);
@@ -1441,7 +1530,7 @@
   buildCounterGoogleCloudMlV1ListVersionsResponse++;
   if (buildCounterGoogleCloudMlV1ListVersionsResponse < 3) {
     o.nextPageToken = 'foo';
-    o.versions = buildUnnamed5567();
+    o.versions = buildUnnamed6455();
   }
   buildCounterGoogleCloudMlV1ListVersionsResponse--;
   return o;
@@ -1452,19 +1541,19 @@
   buildCounterGoogleCloudMlV1ListVersionsResponse++;
   if (buildCounterGoogleCloudMlV1ListVersionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed5567(o.versions);
+    checkUnnamed6455(o.versions);
   }
   buildCounterGoogleCloudMlV1ListVersionsResponse--;
 }
 
-core.List<api.GoogleCloudMlV1Capability> buildUnnamed5568() {
+core.List<api.GoogleCloudMlV1Capability> buildUnnamed6456() {
   var o = <api.GoogleCloudMlV1Capability>[];
   o.add(buildGoogleCloudMlV1Capability());
   o.add(buildGoogleCloudMlV1Capability());
   return o;
 }
 
-void checkUnnamed5568(core.List<api.GoogleCloudMlV1Capability> o) {
+void checkUnnamed6456(core.List<api.GoogleCloudMlV1Capability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Capability(o[0] as api.GoogleCloudMlV1Capability);
   checkGoogleCloudMlV1Capability(o[1] as api.GoogleCloudMlV1Capability);
@@ -1475,7 +1564,7 @@
   var o = api.GoogleCloudMlV1Location();
   buildCounterGoogleCloudMlV1Location++;
   if (buildCounterGoogleCloudMlV1Location < 3) {
-    o.capabilities = buildUnnamed5568();
+    o.capabilities = buildUnnamed6456();
     o.name = 'foo';
   }
   buildCounterGoogleCloudMlV1Location--;
@@ -1485,7 +1574,7 @@
 void checkGoogleCloudMlV1Location(api.GoogleCloudMlV1Location o) {
   buildCounterGoogleCloudMlV1Location++;
   if (buildCounterGoogleCloudMlV1Location < 3) {
-    checkUnnamed5568(o.capabilities);
+    checkUnnamed6456(o.capabilities);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1Location--;
@@ -1510,14 +1599,14 @@
   buildCounterGoogleCloudMlV1ManualScaling--;
 }
 
-core.List<api.GoogleCloudMlV1MeasurementMetric> buildUnnamed5569() {
+core.List<api.GoogleCloudMlV1MeasurementMetric> buildUnnamed6457() {
   var o = <api.GoogleCloudMlV1MeasurementMetric>[];
   o.add(buildGoogleCloudMlV1MeasurementMetric());
   o.add(buildGoogleCloudMlV1MeasurementMetric());
   return o;
 }
 
-void checkUnnamed5569(core.List<api.GoogleCloudMlV1MeasurementMetric> o) {
+void checkUnnamed6457(core.List<api.GoogleCloudMlV1MeasurementMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1MeasurementMetric(
       o[0] as api.GoogleCloudMlV1MeasurementMetric);
@@ -1531,7 +1620,7 @@
   buildCounterGoogleCloudMlV1Measurement++;
   if (buildCounterGoogleCloudMlV1Measurement < 3) {
     o.elapsedTime = 'foo';
-    o.metrics = buildUnnamed5569();
+    o.metrics = buildUnnamed6457();
     o.stepCount = 'foo';
   }
   buildCounterGoogleCloudMlV1Measurement--;
@@ -1542,33 +1631,54 @@
   buildCounterGoogleCloudMlV1Measurement++;
   if (buildCounterGoogleCloudMlV1Measurement < 3) {
     unittest.expect(o.elapsedTime, unittest.equals('foo'));
-    checkUnnamed5569(o.metrics);
+    checkUnnamed6457(o.metrics);
     unittest.expect(o.stepCount, unittest.equals('foo'));
   }
   buildCounterGoogleCloudMlV1Measurement--;
 }
 
-core.Map<core.String, core.String> buildUnnamed5570() {
+core.int buildCounterGoogleCloudMlV1MetricSpec = 0;
+api.GoogleCloudMlV1MetricSpec buildGoogleCloudMlV1MetricSpec() {
+  var o = api.GoogleCloudMlV1MetricSpec();
+  buildCounterGoogleCloudMlV1MetricSpec++;
+  if (buildCounterGoogleCloudMlV1MetricSpec < 3) {
+    o.name = 'foo';
+    o.target = 42;
+  }
+  buildCounterGoogleCloudMlV1MetricSpec--;
+  return o;
+}
+
+void checkGoogleCloudMlV1MetricSpec(api.GoogleCloudMlV1MetricSpec o) {
+  buildCounterGoogleCloudMlV1MetricSpec++;
+  if (buildCounterGoogleCloudMlV1MetricSpec < 3) {
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.target, unittest.equals(42));
+  }
+  buildCounterGoogleCloudMlV1MetricSpec--;
+}
+
+core.Map<core.String, core.String> buildUnnamed6458() {
   var o = <core.String, core.String>{};
   o['x'] = 'foo';
   o['y'] = 'foo';
   return o;
 }
 
-void checkUnnamed5570(core.Map<core.String, core.String> o) {
+void checkUnnamed6458(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o['x'], unittest.equals('foo'));
   unittest.expect(o['y'], unittest.equals('foo'));
 }
 
-core.List<core.String> buildUnnamed5571() {
+core.List<core.String> buildUnnamed6459() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5571(core.List<core.String> o) {
+void checkUnnamed6459(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1582,11 +1692,11 @@
     o.defaultVersion = buildGoogleCloudMlV1Version();
     o.description = 'foo';
     o.etag = 'foo';
-    o.labels = buildUnnamed5570();
+    o.labels = buildUnnamed6458();
     o.name = 'foo';
     o.onlinePredictionConsoleLogging = true;
     o.onlinePredictionLogging = true;
-    o.regions = buildUnnamed5571();
+    o.regions = buildUnnamed6459();
   }
   buildCounterGoogleCloudMlV1Model--;
   return o;
@@ -1598,23 +1708,23 @@
     checkGoogleCloudMlV1Version(o.defaultVersion as api.GoogleCloudMlV1Version);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed5570(o.labels);
+    checkUnnamed6458(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.onlinePredictionConsoleLogging, unittest.isTrue);
     unittest.expect(o.onlinePredictionLogging, unittest.isTrue);
-    checkUnnamed5571(o.regions);
+    checkUnnamed6459(o.regions);
   }
   buildCounterGoogleCloudMlV1Model--;
 }
 
-core.Map<core.String, core.String> buildUnnamed5572() {
+core.Map<core.String, core.String> buildUnnamed6460() {
   var o = <core.String, core.String>{};
   o['x'] = 'foo';
   o['y'] = 'foo';
   return o;
 }
 
-void checkUnnamed5572(core.Map<core.String, core.String> o) {
+void checkUnnamed6460(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o['x'], unittest.equals('foo'));
   unittest.expect(o['y'], unittest.equals('foo'));
@@ -1628,7 +1738,7 @@
     o.createTime = 'foo';
     o.endTime = 'foo';
     o.isCancellationRequested = true;
-    o.labels = buildUnnamed5572();
+    o.labels = buildUnnamed6460();
     o.modelName = 'foo';
     o.operationType = 'foo';
     o.projectNumber = 'foo';
@@ -1646,7 +1756,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.isCancellationRequested, unittest.isTrue);
-    checkUnnamed5572(o.labels);
+    checkUnnamed6460(o.labels);
     unittest.expect(o.modelName, unittest.equals('foo'));
     unittest.expect(o.operationType, unittest.equals('foo'));
     unittest.expect(o.projectNumber, unittest.equals('foo'));
@@ -1656,27 +1766,27 @@
   buildCounterGoogleCloudMlV1OperationMetadata--;
 }
 
-core.List<core.String> buildUnnamed5573() {
+core.List<core.String> buildUnnamed6461() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5573(core.List<core.String> o) {
+void checkUnnamed6461(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.List<core.double> buildUnnamed5574() {
+core.List<core.double> buildUnnamed6462() {
   var o = <core.double>[];
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-void checkUnnamed5574(core.List<core.double> o) {
+void checkUnnamed6462(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1687,8 +1797,8 @@
   var o = api.GoogleCloudMlV1ParameterSpec();
   buildCounterGoogleCloudMlV1ParameterSpec++;
   if (buildCounterGoogleCloudMlV1ParameterSpec < 3) {
-    o.categoricalValues = buildUnnamed5573();
-    o.discreteValues = buildUnnamed5574();
+    o.categoricalValues = buildUnnamed6461();
+    o.discreteValues = buildUnnamed6462();
     o.maxValue = 42.0;
     o.minValue = 42.0;
     o.parameterName = 'foo';
@@ -1702,8 +1812,8 @@
 void checkGoogleCloudMlV1ParameterSpec(api.GoogleCloudMlV1ParameterSpec o) {
   buildCounterGoogleCloudMlV1ParameterSpec++;
   if (buildCounterGoogleCloudMlV1ParameterSpec < 3) {
-    checkUnnamed5573(o.categoricalValues);
-    checkUnnamed5574(o.discreteValues);
+    checkUnnamed6461(o.categoricalValues);
+    checkUnnamed6462(o.discreteValues);
     unittest.expect(o.maxValue, unittest.equals(42.0));
     unittest.expect(o.minValue, unittest.equals(42.0));
     unittest.expect(o.parameterName, unittest.equals('foo'));
@@ -1732,14 +1842,14 @@
   buildCounterGoogleCloudMlV1PredictRequest--;
 }
 
-core.List<core.String> buildUnnamed5575() {
+core.List<core.String> buildUnnamed6463() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5575(core.List<core.String> o) {
+void checkUnnamed6463(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1752,7 +1862,7 @@
   if (buildCounterGoogleCloudMlV1PredictionInput < 3) {
     o.batchSize = 'foo';
     o.dataFormat = 'foo';
-    o.inputPaths = buildUnnamed5575();
+    o.inputPaths = buildUnnamed6463();
     o.maxWorkerCount = 'foo';
     o.modelName = 'foo';
     o.outputDataFormat = 'foo';
@@ -1772,7 +1882,7 @@
   if (buildCounterGoogleCloudMlV1PredictionInput < 3) {
     unittest.expect(o.batchSize, unittest.equals('foo'));
     unittest.expect(o.dataFormat, unittest.equals('foo'));
-    checkUnnamed5575(o.inputPaths);
+    checkUnnamed6463(o.inputPaths);
     unittest.expect(o.maxWorkerCount, unittest.equals('foo'));
     unittest.expect(o.modelName, unittest.equals('foo'));
     unittest.expect(o.outputDataFormat, unittest.equals('foo'));
@@ -1812,27 +1922,27 @@
   buildCounterGoogleCloudMlV1PredictionOutput--;
 }
 
-core.List<core.String> buildUnnamed5576() {
+core.List<core.String> buildUnnamed6464() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5576(core.List<core.String> o) {
+void checkUnnamed6464(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.List<core.String> buildUnnamed5577() {
+core.List<core.String> buildUnnamed6465() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5577(core.List<core.String> o) {
+void checkUnnamed6465(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1844,8 +1954,9 @@
   buildCounterGoogleCloudMlV1ReplicaConfig++;
   if (buildCounterGoogleCloudMlV1ReplicaConfig < 3) {
     o.acceleratorConfig = buildGoogleCloudMlV1AcceleratorConfig();
-    o.containerArgs = buildUnnamed5576();
-    o.containerCommand = buildUnnamed5577();
+    o.containerArgs = buildUnnamed6464();
+    o.containerCommand = buildUnnamed6465();
+    o.diskConfig = buildGoogleCloudMlV1DiskConfig();
     o.imageUri = 'foo';
     o.tpuTfVersion = 'foo';
   }
@@ -1858,8 +1969,10 @@
   if (buildCounterGoogleCloudMlV1ReplicaConfig < 3) {
     checkGoogleCloudMlV1AcceleratorConfig(
         o.acceleratorConfig as api.GoogleCloudMlV1AcceleratorConfig);
-    checkUnnamed5576(o.containerArgs);
-    checkUnnamed5577(o.containerCommand);
+    checkUnnamed6464(o.containerArgs);
+    checkUnnamed6465(o.containerCommand);
+    checkGoogleCloudMlV1DiskConfig(
+        o.diskConfig as api.GoogleCloudMlV1DiskConfig);
     unittest.expect(o.imageUri, unittest.equals('foo'));
     unittest.expect(o.tpuTfVersion, unittest.equals('foo'));
   }
@@ -2013,14 +2126,14 @@
   buildCounterGoogleCloudMlV1Study--;
 }
 
-core.List<api.GoogleCloudMlV1StudyConfigMetricSpec> buildUnnamed5578() {
+core.List<api.GoogleCloudMlV1StudyConfigMetricSpec> buildUnnamed6466() {
   var o = <api.GoogleCloudMlV1StudyConfigMetricSpec>[];
   o.add(buildGoogleCloudMlV1StudyConfigMetricSpec());
   o.add(buildGoogleCloudMlV1StudyConfigMetricSpec());
   return o;
 }
 
-void checkUnnamed5578(core.List<api.GoogleCloudMlV1StudyConfigMetricSpec> o) {
+void checkUnnamed6466(core.List<api.GoogleCloudMlV1StudyConfigMetricSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1StudyConfigMetricSpec(
       o[0] as api.GoogleCloudMlV1StudyConfigMetricSpec);
@@ -2028,14 +2141,14 @@
       o[1] as api.GoogleCloudMlV1StudyConfigMetricSpec);
 }
 
-core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> buildUnnamed5579() {
+core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> buildUnnamed6467() {
   var o = <api.GoogleCloudMlV1StudyConfigParameterSpec>[];
   o.add(buildGoogleCloudMlV1StudyConfigParameterSpec());
   o.add(buildGoogleCloudMlV1StudyConfigParameterSpec());
   return o;
 }
 
-void checkUnnamed5579(
+void checkUnnamed6467(
     core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1StudyConfigParameterSpec(
@@ -2051,8 +2164,8 @@
   if (buildCounterGoogleCloudMlV1StudyConfig < 3) {
     o.algorithm = 'foo';
     o.automatedStoppingConfig = buildGoogleCloudMlV1AutomatedStoppingConfig();
-    o.metrics = buildUnnamed5578();
-    o.parameters = buildUnnamed5579();
+    o.metrics = buildUnnamed6466();
+    o.parameters = buildUnnamed6467();
   }
   buildCounterGoogleCloudMlV1StudyConfig--;
   return o;
@@ -2064,8 +2177,8 @@
     unittest.expect(o.algorithm, unittest.equals('foo'));
     checkGoogleCloudMlV1AutomatedStoppingConfig(o.automatedStoppingConfig
         as api.GoogleCloudMlV1AutomatedStoppingConfig);
-    checkUnnamed5578(o.metrics);
-    checkUnnamed5579(o.parameters);
+    checkUnnamed6466(o.metrics);
+    checkUnnamed6467(o.parameters);
   }
   buildCounterGoogleCloudMlV1StudyConfig--;
 }
@@ -2120,14 +2233,14 @@
   buildCounterGoogleCloudMlV1SuggestTrialsRequest--;
 }
 
-core.List<api.GoogleCloudMlV1Trial> buildUnnamed5580() {
+core.List<api.GoogleCloudMlV1Trial> buildUnnamed6468() {
   var o = <api.GoogleCloudMlV1Trial>[];
   o.add(buildGoogleCloudMlV1Trial());
   o.add(buildGoogleCloudMlV1Trial());
   return o;
 }
 
-void checkUnnamed5580(core.List<api.GoogleCloudMlV1Trial> o) {
+void checkUnnamed6468(core.List<api.GoogleCloudMlV1Trial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Trial(o[0] as api.GoogleCloudMlV1Trial);
   checkGoogleCloudMlV1Trial(o[1] as api.GoogleCloudMlV1Trial);
@@ -2142,7 +2255,7 @@
     o.endTime = 'foo';
     o.startTime = 'foo';
     o.studyState = 'foo';
-    o.trials = buildUnnamed5580();
+    o.trials = buildUnnamed6468();
   }
   buildCounterGoogleCloudMlV1SuggestTrialsResponse--;
   return o;
@@ -2155,32 +2268,32 @@
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.studyState, unittest.equals('foo'));
-    checkUnnamed5580(o.trials);
+    checkUnnamed6468(o.trials);
   }
   buildCounterGoogleCloudMlV1SuggestTrialsResponse--;
 }
 
-core.List<core.String> buildUnnamed5581() {
+core.List<core.String> buildUnnamed6469() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5581(core.List<core.String> o) {
+void checkUnnamed6469(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.List<core.String> buildUnnamed5582() {
+core.List<core.String> buildUnnamed6470() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5582(core.List<core.String> o) {
+void checkUnnamed6470(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2191,7 +2304,7 @@
   var o = api.GoogleCloudMlV1TrainingInput();
   buildCounterGoogleCloudMlV1TrainingInput++;
   if (buildCounterGoogleCloudMlV1TrainingInput < 3) {
-    o.args = buildUnnamed5581();
+    o.args = buildUnnamed6469();
     o.encryptionConfig = buildGoogleCloudMlV1EncryptionConfig();
     o.evaluatorConfig = buildGoogleCloudMlV1ReplicaConfig();
     o.evaluatorCount = 'foo';
@@ -2201,7 +2314,7 @@
     o.masterConfig = buildGoogleCloudMlV1ReplicaConfig();
     o.masterType = 'foo';
     o.network = 'foo';
-    o.packageUris = buildUnnamed5582();
+    o.packageUris = buildUnnamed6470();
     o.parameterServerConfig = buildGoogleCloudMlV1ReplicaConfig();
     o.parameterServerCount = 'foo';
     o.parameterServerType = 'foo';
@@ -2224,7 +2337,7 @@
 void checkGoogleCloudMlV1TrainingInput(api.GoogleCloudMlV1TrainingInput o) {
   buildCounterGoogleCloudMlV1TrainingInput++;
   if (buildCounterGoogleCloudMlV1TrainingInput < 3) {
-    checkUnnamed5581(o.args);
+    checkUnnamed6469(o.args);
     checkGoogleCloudMlV1EncryptionConfig(
         o.encryptionConfig as api.GoogleCloudMlV1EncryptionConfig);
     checkGoogleCloudMlV1ReplicaConfig(
@@ -2238,7 +2351,7 @@
         o.masterConfig as api.GoogleCloudMlV1ReplicaConfig);
     unittest.expect(o.masterType, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkUnnamed5582(o.packageUris);
+    checkUnnamed6470(o.packageUris);
     checkGoogleCloudMlV1ReplicaConfig(
         o.parameterServerConfig as api.GoogleCloudMlV1ReplicaConfig);
     unittest.expect(o.parameterServerCount, unittest.equals('foo'));
@@ -2260,14 +2373,14 @@
   buildCounterGoogleCloudMlV1TrainingInput--;
 }
 
-core.List<api.GoogleCloudMlV1HyperparameterOutput> buildUnnamed5583() {
+core.List<api.GoogleCloudMlV1HyperparameterOutput> buildUnnamed6471() {
   var o = <api.GoogleCloudMlV1HyperparameterOutput>[];
   o.add(buildGoogleCloudMlV1HyperparameterOutput());
   o.add(buildGoogleCloudMlV1HyperparameterOutput());
   return o;
 }
 
-void checkUnnamed5583(core.List<api.GoogleCloudMlV1HyperparameterOutput> o) {
+void checkUnnamed6471(core.List<api.GoogleCloudMlV1HyperparameterOutput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1HyperparameterOutput(
       o[0] as api.GoogleCloudMlV1HyperparameterOutput);
@@ -2286,7 +2399,7 @@
     o.hyperparameterMetricTag = 'foo';
     o.isBuiltInAlgorithmJob = true;
     o.isHyperparameterTuningJob = true;
-    o.trials = buildUnnamed5583();
+    o.trials = buildUnnamed6471();
   }
   buildCounterGoogleCloudMlV1TrainingOutput--;
   return o;
@@ -2302,32 +2415,32 @@
     unittest.expect(o.hyperparameterMetricTag, unittest.equals('foo'));
     unittest.expect(o.isBuiltInAlgorithmJob, unittest.isTrue);
     unittest.expect(o.isHyperparameterTuningJob, unittest.isTrue);
-    checkUnnamed5583(o.trials);
+    checkUnnamed6471(o.trials);
   }
   buildCounterGoogleCloudMlV1TrainingOutput--;
 }
 
-core.List<api.GoogleCloudMlV1Measurement> buildUnnamed5584() {
+core.List<api.GoogleCloudMlV1Measurement> buildUnnamed6472() {
   var o = <api.GoogleCloudMlV1Measurement>[];
   o.add(buildGoogleCloudMlV1Measurement());
   o.add(buildGoogleCloudMlV1Measurement());
   return o;
 }
 
-void checkUnnamed5584(core.List<api.GoogleCloudMlV1Measurement> o) {
+void checkUnnamed6472(core.List<api.GoogleCloudMlV1Measurement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1Measurement(o[0] as api.GoogleCloudMlV1Measurement);
   checkGoogleCloudMlV1Measurement(o[1] as api.GoogleCloudMlV1Measurement);
 }
 
-core.List<api.GoogleCloudMlV1TrialParameter> buildUnnamed5585() {
+core.List<api.GoogleCloudMlV1TrialParameter> buildUnnamed6473() {
   var o = <api.GoogleCloudMlV1TrialParameter>[];
   o.add(buildGoogleCloudMlV1TrialParameter());
   o.add(buildGoogleCloudMlV1TrialParameter());
   return o;
 }
 
-void checkUnnamed5585(core.List<api.GoogleCloudMlV1TrialParameter> o) {
+void checkUnnamed6473(core.List<api.GoogleCloudMlV1TrialParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudMlV1TrialParameter(o[0] as api.GoogleCloudMlV1TrialParameter);
   checkGoogleCloudMlV1TrialParameter(o[1] as api.GoogleCloudMlV1TrialParameter);
@@ -2342,9 +2455,9 @@
     o.endTime = 'foo';
     o.finalMeasurement = buildGoogleCloudMlV1Measurement();
     o.infeasibleReason = 'foo';
-    o.measurements = buildUnnamed5584();
+    o.measurements = buildUnnamed6472();
     o.name = 'foo';
-    o.parameters = buildUnnamed5585();
+    o.parameters = buildUnnamed6473();
     o.startTime = 'foo';
     o.state = 'foo';
     o.trialInfeasible = true;
@@ -2361,9 +2474,9 @@
     checkGoogleCloudMlV1Measurement(
         o.finalMeasurement as api.GoogleCloudMlV1Measurement);
     unittest.expect(o.infeasibleReason, unittest.equals('foo'));
-    checkUnnamed5584(o.measurements);
+    checkUnnamed6472(o.measurements);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed5585(o.parameters);
+    checkUnnamed6473(o.parameters);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.trialInfeasible, unittest.isTrue);
@@ -2371,27 +2484,27 @@
   buildCounterGoogleCloudMlV1Trial--;
 }
 
-core.Map<core.String, core.String> buildUnnamed5586() {
+core.Map<core.String, core.String> buildUnnamed6474() {
   var o = <core.String, core.String>{};
   o['x'] = 'foo';
   o['y'] = 'foo';
   return o;
 }
 
-void checkUnnamed5586(core.Map<core.String, core.String> o) {
+void checkUnnamed6474(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o['x'], unittest.equals('foo'));
   unittest.expect(o['y'], unittest.equals('foo'));
 }
 
-core.List<core.String> buildUnnamed5587() {
+core.List<core.String> buildUnnamed6475() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5587(core.List<core.String> o) {
+void checkUnnamed6475(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2413,12 +2526,14 @@
     o.explanationConfig = buildGoogleCloudMlV1ExplanationConfig();
     o.framework = 'foo';
     o.isDefault = true;
-    o.labels = buildUnnamed5586();
+    o.labels = buildUnnamed6474();
+    o.lastMigrationModelId = 'foo';
+    o.lastMigrationTime = 'foo';
     o.lastUseTime = 'foo';
     o.machineType = 'foo';
     o.manualScaling = buildGoogleCloudMlV1ManualScaling();
     o.name = 'foo';
-    o.packageUris = buildUnnamed5587();
+    o.packageUris = buildUnnamed6475();
     o.predictionClass = 'foo';
     o.pythonVersion = 'foo';
     o.requestLoggingConfig = buildGoogleCloudMlV1RequestLoggingConfig();
@@ -2449,13 +2564,15 @@
         o.explanationConfig as api.GoogleCloudMlV1ExplanationConfig);
     unittest.expect(o.framework, unittest.equals('foo'));
     unittest.expect(o.isDefault, unittest.isTrue);
-    checkUnnamed5586(o.labels);
+    checkUnnamed6474(o.labels);
+    unittest.expect(o.lastMigrationModelId, unittest.equals('foo'));
+    unittest.expect(o.lastMigrationTime, unittest.equals('foo'));
     unittest.expect(o.lastUseTime, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkGoogleCloudMlV1ManualScaling(
         o.manualScaling as api.GoogleCloudMlV1ManualScaling);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed5587(o.packageUris);
+    checkUnnamed6475(o.packageUris);
     unittest.expect(o.predictionClass, unittest.equals('foo'));
     unittest.expect(o.pythonVersion, unittest.equals('foo'));
     checkGoogleCloudMlV1RequestLoggingConfig(
@@ -2487,14 +2604,14 @@
   buildCounterGoogleCloudMlV1XraiAttribution--;
 }
 
-core.List<api.GoogleIamV1AuditLogConfig> buildUnnamed5588() {
+core.List<api.GoogleIamV1AuditLogConfig> buildUnnamed6476() {
   var o = <api.GoogleIamV1AuditLogConfig>[];
   o.add(buildGoogleIamV1AuditLogConfig());
   o.add(buildGoogleIamV1AuditLogConfig());
   return o;
 }
 
-void checkUnnamed5588(core.List<api.GoogleIamV1AuditLogConfig> o) {
+void checkUnnamed6476(core.List<api.GoogleIamV1AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleIamV1AuditLogConfig(o[0] as api.GoogleIamV1AuditLogConfig);
   checkGoogleIamV1AuditLogConfig(o[1] as api.GoogleIamV1AuditLogConfig);
@@ -2505,7 +2622,7 @@
   var o = api.GoogleIamV1AuditConfig();
   buildCounterGoogleIamV1AuditConfig++;
   if (buildCounterGoogleIamV1AuditConfig < 3) {
-    o.auditLogConfigs = buildUnnamed5588();
+    o.auditLogConfigs = buildUnnamed6476();
     o.service = 'foo';
   }
   buildCounterGoogleIamV1AuditConfig--;
@@ -2515,20 +2632,20 @@
 void checkGoogleIamV1AuditConfig(api.GoogleIamV1AuditConfig o) {
   buildCounterGoogleIamV1AuditConfig++;
   if (buildCounterGoogleIamV1AuditConfig < 3) {
-    checkUnnamed5588(o.auditLogConfigs);
+    checkUnnamed6476(o.auditLogConfigs);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterGoogleIamV1AuditConfig--;
 }
 
-core.List<core.String> buildUnnamed5589() {
+core.List<core.String> buildUnnamed6477() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5589(core.List<core.String> o) {
+void checkUnnamed6477(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2539,7 +2656,7 @@
   var o = api.GoogleIamV1AuditLogConfig();
   buildCounterGoogleIamV1AuditLogConfig++;
   if (buildCounterGoogleIamV1AuditLogConfig < 3) {
-    o.exemptedMembers = buildUnnamed5589();
+    o.exemptedMembers = buildUnnamed6477();
     o.logType = 'foo';
   }
   buildCounterGoogleIamV1AuditLogConfig--;
@@ -2549,20 +2666,20 @@
 void checkGoogleIamV1AuditLogConfig(api.GoogleIamV1AuditLogConfig o) {
   buildCounterGoogleIamV1AuditLogConfig++;
   if (buildCounterGoogleIamV1AuditLogConfig < 3) {
-    checkUnnamed5589(o.exemptedMembers);
+    checkUnnamed6477(o.exemptedMembers);
     unittest.expect(o.logType, unittest.equals('foo'));
   }
   buildCounterGoogleIamV1AuditLogConfig--;
 }
 
-core.List<core.String> buildUnnamed5590() {
+core.List<core.String> buildUnnamed6478() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5590(core.List<core.String> o) {
+void checkUnnamed6478(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2573,9 +2690,8 @@
   var o = api.GoogleIamV1Binding();
   buildCounterGoogleIamV1Binding++;
   if (buildCounterGoogleIamV1Binding < 3) {
-    o.bindingId = 'foo';
     o.condition = buildGoogleTypeExpr();
-    o.members = buildUnnamed5590();
+    o.members = buildUnnamed6478();
     o.role = 'foo';
   }
   buildCounterGoogleIamV1Binding--;
@@ -2585,35 +2701,34 @@
 void checkGoogleIamV1Binding(api.GoogleIamV1Binding o) {
   buildCounterGoogleIamV1Binding++;
   if (buildCounterGoogleIamV1Binding < 3) {
-    unittest.expect(o.bindingId, unittest.equals('foo'));
     checkGoogleTypeExpr(o.condition as api.GoogleTypeExpr);
-    checkUnnamed5590(o.members);
+    checkUnnamed6478(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterGoogleIamV1Binding--;
 }
 
-core.List<api.GoogleIamV1AuditConfig> buildUnnamed5591() {
+core.List<api.GoogleIamV1AuditConfig> buildUnnamed6479() {
   var o = <api.GoogleIamV1AuditConfig>[];
   o.add(buildGoogleIamV1AuditConfig());
   o.add(buildGoogleIamV1AuditConfig());
   return o;
 }
 
-void checkUnnamed5591(core.List<api.GoogleIamV1AuditConfig> o) {
+void checkUnnamed6479(core.List<api.GoogleIamV1AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleIamV1AuditConfig(o[0] as api.GoogleIamV1AuditConfig);
   checkGoogleIamV1AuditConfig(o[1] as api.GoogleIamV1AuditConfig);
 }
 
-core.List<api.GoogleIamV1Binding> buildUnnamed5592() {
+core.List<api.GoogleIamV1Binding> buildUnnamed6480() {
   var o = <api.GoogleIamV1Binding>[];
   o.add(buildGoogleIamV1Binding());
   o.add(buildGoogleIamV1Binding());
   return o;
 }
 
-void checkUnnamed5592(core.List<api.GoogleIamV1Binding> o) {
+void checkUnnamed6480(core.List<api.GoogleIamV1Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleIamV1Binding(o[0] as api.GoogleIamV1Binding);
   checkGoogleIamV1Binding(o[1] as api.GoogleIamV1Binding);
@@ -2624,8 +2739,8 @@
   var o = api.GoogleIamV1Policy();
   buildCounterGoogleIamV1Policy++;
   if (buildCounterGoogleIamV1Policy < 3) {
-    o.auditConfigs = buildUnnamed5591();
-    o.bindings = buildUnnamed5592();
+    o.auditConfigs = buildUnnamed6479();
+    o.bindings = buildUnnamed6480();
     o.etag = 'foo';
     o.version = 42;
   }
@@ -2636,8 +2751,8 @@
 void checkGoogleIamV1Policy(api.GoogleIamV1Policy o) {
   buildCounterGoogleIamV1Policy++;
   if (buildCounterGoogleIamV1Policy < 3) {
-    checkUnnamed5591(o.auditConfigs);
-    checkUnnamed5592(o.bindings);
+    checkUnnamed6479(o.auditConfigs);
+    checkUnnamed6480(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -2665,14 +2780,14 @@
   buildCounterGoogleIamV1SetIamPolicyRequest--;
 }
 
-core.List<core.String> buildUnnamed5593() {
+core.List<core.String> buildUnnamed6481() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5593(core.List<core.String> o) {
+void checkUnnamed6481(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2684,7 +2799,7 @@
   var o = api.GoogleIamV1TestIamPermissionsRequest();
   buildCounterGoogleIamV1TestIamPermissionsRequest++;
   if (buildCounterGoogleIamV1TestIamPermissionsRequest < 3) {
-    o.permissions = buildUnnamed5593();
+    o.permissions = buildUnnamed6481();
   }
   buildCounterGoogleIamV1TestIamPermissionsRequest--;
   return o;
@@ -2694,19 +2809,19 @@
     api.GoogleIamV1TestIamPermissionsRequest o) {
   buildCounterGoogleIamV1TestIamPermissionsRequest++;
   if (buildCounterGoogleIamV1TestIamPermissionsRequest < 3) {
-    checkUnnamed5593(o.permissions);
+    checkUnnamed6481(o.permissions);
   }
   buildCounterGoogleIamV1TestIamPermissionsRequest--;
 }
 
-core.List<core.String> buildUnnamed5594() {
+core.List<core.String> buildUnnamed6482() {
   var o = <core.String>[];
   o.add('foo');
   o.add('foo');
   return o;
 }
 
-void checkUnnamed5594(core.List<core.String> o) {
+void checkUnnamed6482(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2718,7 +2833,7 @@
   var o = api.GoogleIamV1TestIamPermissionsResponse();
   buildCounterGoogleIamV1TestIamPermissionsResponse++;
   if (buildCounterGoogleIamV1TestIamPermissionsResponse < 3) {
-    o.permissions = buildUnnamed5594();
+    o.permissions = buildUnnamed6482();
   }
   buildCounterGoogleIamV1TestIamPermissionsResponse--;
   return o;
@@ -2728,19 +2843,19 @@
     api.GoogleIamV1TestIamPermissionsResponse o) {
   buildCounterGoogleIamV1TestIamPermissionsResponse++;
   if (buildCounterGoogleIamV1TestIamPermissionsResponse < 3) {
-    checkUnnamed5594(o.permissions);
+    checkUnnamed6482(o.permissions);
   }
   buildCounterGoogleIamV1TestIamPermissionsResponse--;
 }
 
-core.List<api.GoogleLongrunningOperation> buildUnnamed5595() {
+core.List<api.GoogleLongrunningOperation> buildUnnamed6483() {
   var o = <api.GoogleLongrunningOperation>[];
   o.add(buildGoogleLongrunningOperation());
   o.add(buildGoogleLongrunningOperation());
   return o;
 }
 
-void checkUnnamed5595(core.List<api.GoogleLongrunningOperation> o) {
+void checkUnnamed6483(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleLongrunningOperation(o[0] as api.GoogleLongrunningOperation);
   checkGoogleLongrunningOperation(o[1] as api.GoogleLongrunningOperation);
@@ -2753,7 +2868,7 @@
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     o.nextPageToken = 'foo';
-    o.operations = buildUnnamed5595();
+    o.operations = buildUnnamed6483();
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
   return o;
@@ -2764,12 +2879,12 @@
   buildCounterGoogleLongrunningListOperationsResponse++;
   if (buildCounterGoogleLongrunningListOperationsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed5595(o.operations);
+    checkUnnamed6483(o.operations);
   }
   buildCounterGoogleLongrunningListOperationsResponse--;
 }
 
-core.Map<core.String, core.Object> buildUnnamed5596() {
+core.Map<core.String, core.Object> buildUnnamed6484() {
   var o = <core.String, core.Object>{};
   o['x'] = {
     'list': [1, 2, 3],
@@ -2784,7 +2899,7 @@
   return o;
 }
 
-void checkUnnamed5596(core.Map<core.String, core.Object> o) {
+void checkUnnamed6484(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o['x']) as core.Map;
   unittest.expect(casted3, unittest.hasLength(3));
@@ -2798,7 +2913,7 @@
   unittest.expect(casted4['string'], unittest.equals('foo'));
 }
 
-core.Map<core.String, core.Object> buildUnnamed5597() {
+core.Map<core.String, core.Object> buildUnnamed6485() {
   var o = <core.String, core.Object>{};
   o['x'] = {
     'list': [1, 2, 3],
@@ -2813,7 +2928,7 @@
   return o;
 }
 
-void checkUnnamed5597(core.Map<core.String, core.Object> o) {
+void checkUnnamed6485(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o['x']) as core.Map;
   unittest.expect(casted5, unittest.hasLength(3));
@@ -2834,9 +2949,9 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     o.done = true;
     o.error = buildGoogleRpcStatus();
-    o.metadata = buildUnnamed5596();
+    o.metadata = buildUnnamed6484();
     o.name = 'foo';
-    o.response = buildUnnamed5597();
+    o.response = buildUnnamed6485();
   }
   buildCounterGoogleLongrunningOperation--;
   return o;
@@ -2847,9 +2962,9 @@
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
     checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
-    checkUnnamed5596(o.metadata);
+    checkUnnamed6484(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed5597(o.response);
+    checkUnnamed6485(o.response);
   }
   buildCounterGoogleLongrunningOperation--;
 }
@@ -2869,7 +2984,7 @@
   buildCounterGoogleProtobufEmpty--;
 }
 
-core.Map<core.String, core.Object> buildUnnamed5598() {
+core.Map<core.String, core.Object> buildUnnamed6486() {
   var o = <core.String, core.Object>{};
   o['x'] = {
     'list': [1, 2, 3],
@@ -2884,7 +2999,7 @@
   return o;
 }
 
-void checkUnnamed5598(core.Map<core.String, core.Object> o) {
+void checkUnnamed6486(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o['x']) as core.Map;
   unittest.expect(casted7, unittest.hasLength(3));
@@ -2898,17 +3013,17 @@
   unittest.expect(casted8['string'], unittest.equals('foo'));
 }
 
-core.List<core.Map<core.String, core.Object>> buildUnnamed5599() {
+core.List<core.Map<core.String, core.Object>> buildUnnamed6487() {
   var o = <core.Map<core.String, core.Object>>[];
-  o.add(buildUnnamed5598());
-  o.add(buildUnnamed5598());
+  o.add(buildUnnamed6486());
+  o.add(buildUnnamed6486());
   return o;
 }
 
-void checkUnnamed5599(core.List<core.Map<core.String, core.Object>> o) {
+void checkUnnamed6487(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed5598(o[0]);
-  checkUnnamed5598(o[1]);
+  checkUnnamed6486(o[0]);
+  checkUnnamed6486(o[1]);
 }
 
 core.int buildCounterGoogleRpcStatus = 0;
@@ -2917,7 +3032,7 @@
   buildCounterGoogleRpcStatus++;
   if (buildCounterGoogleRpcStatus < 3) {
     o.code = 42;
-    o.details = buildUnnamed5599();
+    o.details = buildUnnamed6487();
     o.message = 'foo';
   }
   buildCounterGoogleRpcStatus--;
@@ -2928,7 +3043,7 @@
   buildCounterGoogleRpcStatus++;
   if (buildCounterGoogleRpcStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed5599(o.details);
+    checkUnnamed6487(o.details);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterGoogleRpcStatus--;
@@ -3270,6 +3385,14 @@
     });
   });
 
+  unittest.group('obj-schema-GoogleCloudMlV1DiskConfig', () {
+    unittest.test('to-json--from-json', () {
+      var o = buildGoogleCloudMlV1DiskConfig();
+      var od = api.GoogleCloudMlV1DiskConfig.fromJson(o.toJson());
+      checkGoogleCloudMlV1DiskConfig(od as api.GoogleCloudMlV1DiskConfig);
+    });
+  });
+
   unittest.group('obj-schema-GoogleCloudMlV1EncryptionConfig', () {
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1EncryptionConfig();
@@ -3378,6 +3501,25 @@
     });
   });
 
+  unittest.group('obj-schema-GoogleCloudMlV1ListOptimalTrialsRequest', () {
+    unittest.test('to-json--from-json', () {
+      var o = buildGoogleCloudMlV1ListOptimalTrialsRequest();
+      var od = api.GoogleCloudMlV1ListOptimalTrialsRequest.fromJson(o.toJson());
+      checkGoogleCloudMlV1ListOptimalTrialsRequest(
+          od as api.GoogleCloudMlV1ListOptimalTrialsRequest);
+    });
+  });
+
+  unittest.group('obj-schema-GoogleCloudMlV1ListOptimalTrialsResponse', () {
+    unittest.test('to-json--from-json', () {
+      var o = buildGoogleCloudMlV1ListOptimalTrialsResponse();
+      var od =
+          api.GoogleCloudMlV1ListOptimalTrialsResponse.fromJson(o.toJson());
+      checkGoogleCloudMlV1ListOptimalTrialsResponse(
+          od as api.GoogleCloudMlV1ListOptimalTrialsResponse);
+    });
+  });
+
   unittest.group('obj-schema-GoogleCloudMlV1ListStudiesResponse', () {
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ListStudiesResponse();
@@ -3429,6 +3571,14 @@
     });
   });
 
+  unittest.group('obj-schema-GoogleCloudMlV1MetricSpec', () {
+    unittest.test('to-json--from-json', () {
+      var o = buildGoogleCloudMlV1MetricSpec();
+      var od = api.GoogleCloudMlV1MetricSpec.fromJson(o.toJson());
+      checkGoogleCloudMlV1MetricSpec(od as api.GoogleCloudMlV1MetricSpec);
+    });
+  });
+
   unittest.group('obj-schema-GoogleCloudMlV1Model', () {
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Model();
@@ -5138,6 +5288,66 @@
       })));
     });
 
+    unittest.test('method--listOptimalTrials', () {
+      var mock = HttpServerMock();
+      var res = api.CloudMachineLearningEngineApi(mock)
+          .projects
+          .locations
+          .studies
+          .trials;
+      var arg_request = buildGoogleCloudMlV1ListOptimalTrialsRequest();
+      var arg_parent = 'foo';
+      var arg_$fields = 'foo';
+      mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
+        var obj = api.GoogleCloudMlV1ListOptimalTrialsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1ListOptimalTrialsRequest(
+            obj as api.GoogleCloudMlV1ListOptimalTrialsRequest);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        core.int index;
+        core.String subPart;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(
+            path.substring(pathOffset, pathOffset + 3), unittest.equals("v1/"));
+        pathOffset += 3;
+        // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = <core.String, core.List<core.String>>{};
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
+
+        if (query.isNotEmpty) {
+          for (var part in query.split('&')) {
+            var keyValue = part.split('=');
+            addQueryParam(
+              core.Uri.decodeQueryComponent(keyValue[0]),
+              core.Uri.decodeQueryComponent(keyValue[1]),
+            );
+          }
+        }
+        unittest.expect(queryMap["fields"].first, unittest.equals(arg_$fields));
+
+        var h = {
+          'content-type': 'application/json; charset=utf-8',
+        };
+        var resp = convert.json
+            .encode(buildGoogleCloudMlV1ListOptimalTrialsResponse());
+        return async.Future.value(stringResponse(200, h, resp));
+      }), true);
+      res
+          .listOptimalTrials(arg_request, arg_parent, $fields: arg_$fields)
+          .then(unittest.expectAsync1(((response) {
+        checkGoogleCloudMlV1ListOptimalTrialsResponse(
+            response as api.GoogleCloudMlV1ListOptimalTrialsResponse);
+      })));
+    });
+
     unittest.test('method--stop', () {
       var mock = HttpServerMock();
       var res = api.CloudMachineLearningEngineApi(mock)
