diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-10-21 01:36:47 -0500 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-10-21 01:36:47 -0500 |
commit | 07a2de27b57848789171dee2559e4bd78d0e921c (patch) | |
tree | 67f4a95dc146a09207f293feccb6555063c6f955 /hscript/script.cc | |
parent | 790217353e94a4a9ee14d51b8a9e6c2dafc6377d (diff) | |
download | horizon-07a2de27b57848789171dee2559e4bd78d0e921c.tar.gz horizon-07a2de27b57848789171dee2559e4bd78d0e921c.tar.bz2 horizon-07a2de27b57848789171dee2559e4bd78d0e921c.tar.xz horizon-07a2de27b57848789171dee2559e4bd78d0e921c.zip |
hscript: Implement DiskLabel, add tests
Diffstat (limited to 'hscript/script.cc')
-rw-r--r-- | hscript/script.cc | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/hscript/script.cc b/hscript/script.cc index 785e40e..ee638bb 100644 --- a/hscript/script.cc +++ b/hscript/script.cc @@ -103,6 +103,8 @@ struct Script::ScriptPrivate { /*! Disk identification keys */ std::vector< std::unique_ptr<DiskId> > diskids; + /*! Disklabel configuration keys */ + std::vector< std::unique_ptr<DiskLabel> > disklabels; /*! Target system's mountpoints. */ std::vector< std::unique_ptr<Mount> > mounts; @@ -157,6 +159,10 @@ struct Script::ScriptPrivate { std::unique_ptr<DiskId> diskid(dynamic_cast<DiskId *>(obj)); this->diskids.push_back(std::move(diskid)); return true; + } else if(key_name == "disklabel") { + std::unique_ptr<DiskLabel> l(dynamic_cast<DiskLabel *>(obj)); + this->disklabels.push_back(std::move(l)); + return true; } else if(key_name == "mount") { std::unique_ptr<Mount> mount(dynamic_cast<Mount *>(obj)); this->mounts.push_back(std::move(mount)); @@ -496,7 +502,7 @@ const Script *Script::load(std::istream &sstream, bool Script::validate() const { int failures = 0; - std::set<std::string> seen_diskids, seen_mounts; + std::set<std::string> seen_diskids, seen_labels, seen_mounts; std::map<const std::string, int> seen_iface; /* REQ: Runner.Validate.network */ @@ -698,6 +704,23 @@ bool Script::validate() const { seen_diskids.insert(diskid->device()); } + /* REQ: Runner.Validate.disklabel */ + for(auto &label : this->internal->disklabels) { + if(!label->validate(this->opts)) { + failures++; + continue; + } + + /* REQ: Runner.Validate.disklabel.Unique */ + if(seen_labels.find(label->device()) != seen_labels.end()) { + failures++; + output_error("installfile:" + std::to_string(label->lineno()), + "disklabel: device " + label->device() + + " already has a label queued"); + } + seen_labels.insert(label->device()); + } + /* REQ: Runner.Validate.mount */ for(auto &mount : this->internal->mounts) { if(!mount->validate(this->opts)) { |