summaryrefslogtreecommitdiff
path: root/hscript/script.cc
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2019-10-21 01:36:47 -0500
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2019-10-21 01:36:47 -0500
commit07a2de27b57848789171dee2559e4bd78d0e921c (patch)
tree67f4a95dc146a09207f293feccb6555063c6f955 /hscript/script.cc
parent790217353e94a4a9ee14d51b8a9e6c2dafc6377d (diff)
downloadhorizon-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.cc25
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)) {