[katello-devel] [lzap at fedoraproject.org: [katello-commits] [katello] tdl validation - model code]

Lukas Zapletal lzap at redhat.com
Mon Nov 28 12:56:59 UTC 2011


Hello,

there is new method in system_template model object called validate_tdl
now. It should be used before exporting the TDL manifest.

I have implemented this for our CLI, Mike could you please add a task of
adding some validation hook to the UI code as well? Should be piece of
cake.

Thanks

LZ

----- Forwarded message from lzap <lzap at fedoraproject.org> -----

Date: Mon, 28 Nov 2011 12:32:54 +0000 (UTC)
From: lzap <lzap at fedoraproject.org>
To: katello-commits at lists.fedorahosted.org
Subject: [katello-commits] [katello] tdl validation - model code

commit bbe56ee30775cc215e39778ed9a720e1c4067def
Author: Lukas Zapletal <lzap+git at redhat.com>
Date:   Mon Nov 28 10:11:15 2011 +0100

    tdl validation - model code

 src/app/models/errors.rb                |   17 +++++++++++
 src/app/models/system_template.rb       |   49 ++++++++++++++++++++++++++-----
 src/spec/models/system_template_spec.rb |   14 +++++++++
 3 files changed, 72 insertions(+), 8 deletions(-)
---
diff --git a/src/app/models/errors.rb b/src/app/models/errors.rb
index b11c6d3..4808a4a 100644
--- a/src/app/models/errors.rb
+++ b/src/app/models/errors.rb
@@ -29,4 +29,21 @@ module Errors
   class ConflictException < StandardError; end
 
   class CurrentOrganizationNotFoundException < ActiveRecord::RecordNotFound; end
+
+  class TemplateValidationException < StandardError
+    attr_accessor :errors
+
+    def initialize(msg, errors = [])
+      @errors = errors
+      super(msg)
+    end
+
+    def message
+      if @errors.nil?
+        "#{to_s}: No errors"
+      else
+        "#{to_s}: #{errors.join(', ')}"
+      end
+    end
+  end
 end
diff --git a/src/app/models/system_template.rb b/src/app/models/system_template.rb
index b97072e..95f25c2 100644
--- a/src/app/models/system_template.rb
+++ b/src/app/models/system_template.rb
@@ -114,26 +114,63 @@ class SystemTemplate < ActiveRecord::Base
     self.export_as_hash.to_json
   end
 
+  # Validates if this template can be exported in TDL:
+  # - at least one product is present (1)
+  # - exactly one distribution is present (2)
+  # - ueber certificate for it's organization has been generated (3)
+  #
+  # Throws exception when template does not pass all validations.
+  def validate_tdl
+    verrors = []
+
+    # (1)
+    verrors << "At least one product must be present to export a TDL" if self.products.count < 1
+
+    # (2)
+    verrors << "Exactly one distribution must be present to export a TDL" if self.distributions.count != 1
+
+    # (3)
+    begin
+      Candlepin::Owner.get_ueber_cert(environment.organization.cp_key)
+    rescue RestClient::ResourceNotFound
+      verrors << "Uebercert for #{environment.organization.name} has not been generated."
+    end
+
+    raise Errors::TemplateValidationException.new("Template cannot be exported", verrors) if verrors.count > 0
+    true
+  end
+
   # Returns template in XML TDL format:
   # https://github.com/aeolusproject/imagefactory/blob/master/Documentation/TDL.xsd
+  #
+  # Method validate_tdl MUST be called before exporting, this method expects
+  # validated system template.
   def export_as_tdl
 
+    xm = Builder::XmlMarkup.new
+    xm.instruct!
+
+    begin
+      validate_tdl
+    rescue Errors::TemplateValidationException => e
+      xm.comment! "Template is not complete and will likely fail."
+      e.errors.each do |e|
+        xm.comment! " - #{e}"
+      end
+    end
+
     begin
       uebercert = Candlepin::Owner.get_ueber_cert(environment.organization.cp_key)
     rescue RestClient::ResourceNotFound => e
       uebercert = nil
-      Rails.logger.info "Uebercert for #{environment.organization.name} has not been generated. Using empty cert and key fields."
     end
 
-    xm = Builder::XmlMarkup.new
-    xm.instruct!
     xm.template {
       # mandatory tags
       xm.name self.name
       if self.distributions.count == 1
         xm.os {
           distro = self.distributions.first
-          # TODO this will probably need a "mapping" table (Pulp->Aeolus Family-Version)
           family, version = Mapping::ImageFactoryNaming.translate(distro.family, distro.version)
           xm.name family
           xm.version version
@@ -146,10 +183,6 @@ class SystemTemplate < ActiveRecord::Base
           # TODO root password is hardcoded for now
           xm.rootpw "redhat"
         }
-      elsif self.distributions.count < 1
-        Rails.logger.info "Template '%s' is missing distribution" % self.name
-      else
-        Rails.logger.info "Template '%s' contains more than one distribution" % self.name
       end
       # optional tags
       xm.description self.description unless self.description.nil?
diff --git a/src/spec/models/system_template_spec.rb b/src/spec/models/system_template_spec.rb
index 9429508..16d9ac4 100644
--- a/src/spec/models/system_template_spec.rb
+++ b/src/spec/models/system_template_spec.rb
@@ -595,7 +595,21 @@ describe SystemTemplate do
         subject.xpath("/template/os/install/url").text.should == "https://localhost/pulp/ks/ACME_Corporation/Dev/isos/xxx/"
       end
 
+      it "should be valid" do
+        @tpl1.validate_tdl.should be_true
+      end
+
       it_should_behave_like "valid tdl"
+
+      it "should not be valid without a product" do
+        @tpl1.products.clear
+        expect { @tpl1.validate_tdl }.to raise_error(Errors::TemplateValidationException)
+      end
+
+      it "should not be valid without a distribution" do
+        @tpl1.distributions.clear
+        expect { @tpl1.validate_tdl }.to raise_error(Errors::TemplateValidationException)
+      end
     end
   end
 
_______________________________________________
katello-commits mailing list
katello-commits at lists.fedorahosted.org
https://fedorahosted.org/mailman/listinfo/katello-commits

----- End forwarded message -----

-- 
Later,

 Lukas Zapletal | E32E400A
 RHN Satellite Engineering
 Red Hat Czech s.r.o. Brno




More information about the katello-devel mailing list