Revert "Revert "[autotest] Add shard tables and models to Autotest""

This reverts commit c1a9d91f65d8fa5225ab673266d165e759c645ab.

Change-Id: Ic6e01cbf06279e19b87926a076548731677024fa
Reviewed-on: https://chromium-review.googlesource.com/214027
Reviewed-by: Alex Miller <milleral@chromium.org>
Tested-by: Jakob Jülich <jakobjuelich@chromium.org>
Commit-Queue: Jakob Jülich <jakobjuelich@chromium.org>
diff --git a/frontend/afe/doctests/001_rpc_test.txt b/frontend/afe/doctests/001_rpc_test.txt
index 57f4497..d05d6cd 100644
--- a/frontend/afe/doctests/001_rpc_test.txt
+++ b/frontend/afe/doctests/001_rpc_test.txt
@@ -66,7 +66,7 @@
 ...           'name': 'test_label',
 ...           'platform': 1,
 ...           'kernel_config': '/my/kernel/config',
-...	      'only_if_needed' : False,
+...           'only_if_needed' : False,
 ...           'invalid': 0,
 ...           'atomic_group': None}]
 True
@@ -559,7 +559,8 @@
 ...         'drone_set': drone_set,
 ...         'parameterized_job': None,
 ...         'test_retry': 0,
-...         'parent_job': None}
+...         'parent_job': None,
+...         'shard': None}
 True
 
 # get_host_queue_entries returns a lot of data, so let's only check a couple
diff --git a/frontend/afe/models.py b/frontend/afe/models.py
index 5bb2889..53700ea 100644
--- a/frontend/afe/models.py
+++ b/frontend/afe/models.py
@@ -142,6 +142,16 @@
         return unicode(self.name)
 
 
+class Shard(dbmodels.Model, model_logic.ModelExtensions):
+
+    labels = dbmodels.ManyToManyField(Label, blank=True,
+                                      db_table='afe_shards_labels')
+
+    class Meta:
+        """Metadata for class ParameterizedJob."""
+        db_table = 'afe_shards'
+
+
 class Drone(dbmodels.Model, model_logic.ModelExtensions):
     """
     A scheduler drone
@@ -1066,6 +1076,8 @@
 
     timeout_mins = dbmodels.IntegerField(default=DEFAULT_TIMEOUT_MINS)
 
+    shard = dbmodels.ForeignKey(Shard, blank=True, null=True)
+
     # custom manager
     objects = JobManager()
 
diff --git a/frontend/migrations/094_add_shards.py b/frontend/migrations/094_add_shards.py
new file mode 100644
index 0000000..fbf4c8a
--- /dev/null
+++ b/frontend/migrations/094_add_shards.py
@@ -0,0 +1,31 @@
+UP_SQL = """
+CREATE TABLE afe_shards (
+  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+) ENGINE=innodb;
+
+ALTER TABLE afe_jobs ADD COLUMN shard_id INT NULL;
+ALTER TABLE afe_jobs ADD CONSTRAINT jobs_to_shard_ibfk
+    FOREIGN KEY (shard_id) REFERENCES afe_shards(id);
+
+CREATE TABLE afe_shards_labels (
+    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+    shard_id INT NOT NULL,
+    label_id INT NOT NULL
+) ENGINE=InnoDB;
+
+ALTER TABLE `afe_shards_labels` ADD CONSTRAINT shard_shard_id_fk
+    FOREIGN KEY (`shard_id`) REFERENCES `afe_shards` (`id`);
+ALTER TABLE `afe_shards_labels` ADD CONSTRAINT shard_label_id_fk
+    FOREIGN KEY (`label_id`) REFERENCES `afe_labels` (`id`);
+"""
+
+DOWN_SQL = """
+ALTER TABLE afe_jobs DROP FOREIGN KEY jobs_to_shard_ibfk;
+ALTER TABLE afe_jobs DROP COLUMN shard_id;
+
+ALTER TABLE afe_shards_labels DROP FOREIGN KEY shard_label_id_fk;
+ALTER TABLE afe_shards_labels DROP FOREIGN KEY shard_shard_id_fk;
+DROP TABLE afe_shards_labels;
+
+DROP TABLE afe_shards;
+"""