Add major_version flag in delta_generator.

Only affects major version number in the payload for now, actual implementation
of major version 2 will follow.

TEST=Call delta_generator manually with --major_version=2 then cros payload
show.

Bug: 23694580
Change-Id: I5baca5a868ec00dc2f6ea63d89e295d43283fd32
diff --git a/delta_performer.cc b/delta_performer.cc
index de877b8..6094c5a 100644
--- a/delta_performer.cc
+++ b/delta_performer.cc
@@ -68,6 +68,8 @@
 const unsigned DeltaPerformer::kProgressDownloadWeight = 50;
 const unsigned DeltaPerformer::kProgressOperationsWeight = 50;
 
+const uint64_t kChromeOSMajorPayloadVersion = 1;
+const uint64_t kBrilloMajorPayloadVersion = 2;
 const uint32_t kInPlaceMinorPayloadVersion = 1;
 const uint32_t kSourceMinorPayloadVersion = 2;
 
diff --git a/delta_performer.h b/delta_performer.h
index 45cb615..38a4151 100644
--- a/delta_performer.h
+++ b/delta_performer.h
@@ -36,6 +36,12 @@
 
 namespace chromeos_update_engine {
 
+// The major version used by Chrome OS.
+extern const uint64_t kChromeOSMajorPayloadVersion;
+
+// The major version used by Brillo.
+extern const uint64_t kBrilloMajorPayloadVersion;
+
 // The minor version used by the in-place delta generator algorithm.
 extern const uint32_t kInPlaceMinorPayloadVersion;
 
diff --git a/delta_performer_unittest.cc b/delta_performer_unittest.cc
index 0451d9a..f0f399d 100644
--- a/delta_performer_unittest.cc
+++ b/delta_performer_unittest.cc
@@ -543,6 +543,7 @@
     payload_config.is_delta = !full_rootfs;
     payload_config.hard_chunk_size = chunk_size;
     payload_config.rootfs_partition_size = kRootFSPartitionSize;
+    payload_config.major_version = kChromeOSMajorPayloadVersion;
     payload_config.minor_version = minor_version;
     if (!full_rootfs) {
       payload_config.source.rootfs.path = state->a_img;
diff --git a/payload_generator/generate_delta_main.cc b/payload_generator/generate_delta_main.cc
index 1dedd68..0a5e105 100644
--- a/payload_generator/generate_delta_main.cc
+++ b/payload_generator/generate_delta_main.cc
@@ -261,6 +261,8 @@
   DEFINE_uint64(rootfs_partition_size,
                chromeos_update_engine::kRootFSPartitionSize,
                "RootFS partition size for the image once installed");
+  DEFINE_uint64(major_version, 1,
+               "The major version of the payload being generated.");
   DEFINE_int32(minor_version, -1,
                "The minor version of the payload being generated "
                "(-1 means autodetect).");
@@ -405,6 +407,9 @@
     CHECK(payload_config.source.kernel.OpenFilesystem());
   }
 
+  payload_config.major_version = FLAGS_major_version;
+  LOG(INFO) << "Using provided major_version=" << FLAGS_major_version;
+
   if (FLAGS_minor_version == -1) {
     // Autodetect minor_version by looking at the update_engine.conf in the old
     // image.
diff --git a/payload_generator/payload_file.cc b/payload_generator/payload_file.cc
index d3cc0ba..66f51dd 100644
--- a/payload_generator/payload_file.cc
+++ b/payload_generator/payload_file.cc
@@ -18,6 +18,7 @@
 
 #include <algorithm>
 
+#include "update_engine/delta_performer.h"
 #include "update_engine/file_writer.h"
 #include "update_engine/omaha_hash_calculator.h"
 #include "update_engine/payload_constants.h"
@@ -33,8 +34,6 @@
 
 namespace {
 
-const uint64_t kMajorVersionNumber = 1;
-
 static const char* kInstallOperationTypes[] = {
   "REPLACE",
   "REPLACE_BZ",
@@ -73,6 +72,9 @@
 };
 
 bool PayloadFile::Init(const PayloadGenerationConfig& config) {
+  major_version_ = config.major_version;
+  TEST_AND_RETURN_FALSE(major_version_ == kChromeOSMajorPayloadVersion ||
+                        major_version_ == kBrilloMajorPayloadVersion);
   manifest_.set_minor_version(config.minor_version);
 
   if (!config.source.ImageInfoIsEmpty())
@@ -179,7 +181,7 @@
   TEST_AND_RETURN_FALSE(writer.Write(kDeltaMagic, strlen(kDeltaMagic)));
 
   // Write major version number
-  TEST_AND_RETURN_FALSE(WriteUint64AsBigEndian(&writer, kMajorVersionNumber));
+  TEST_AND_RETURN_FALSE(WriteUint64AsBigEndian(&writer, major_version_));
 
   // Write protobuf length
   TEST_AND_RETURN_FALSE(WriteUint64AsBigEndian(&writer,
diff --git a/payload_generator/payload_file.h b/payload_generator/payload_file.h
index 51c699c..6e0776c 100644
--- a/payload_generator/payload_file.h
+++ b/payload_generator/payload_file.h
@@ -81,6 +81,9 @@
   // payload file.
   static const std::vector<PartitionName> partition_disk_order_;
 
+  // The major_version of the requested payload.
+  uint64_t major_version_;
+
   DeltaArchiveManifest manifest_;
 
   std::map<PartitionName, std::vector<AnnotatedOperation>> aops_map_;
diff --git a/payload_generator/payload_generation_config.h b/payload_generator/payload_generation_config.h
index 191b674..372e427 100644
--- a/payload_generator/payload_generation_config.h
+++ b/payload_generator/payload_generation_config.h
@@ -117,6 +117,9 @@
   // Wheter the requested payload is a delta payload.
   bool is_delta = false;
 
+  // The major_version of the requested payload.
+  uint64_t major_version;
+
   // The minor_version of the requested payload.
   uint32_t minor_version;