Merge "Renders Pod Destriptor File earlier"
authorParker Berberian <pberberian@iol.unh.edu>
Wed, 2 Jan 2019 14:38:04 +0000 (14:38 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Wed, 2 Jan 2019 14:38:04 +0000 (14:38 +0000)
src/api/admin.py
src/api/models.py
src/templates/dashboard/landing.html
src/templates/resource/steps/meta_info.html
src/templates/resource/steps/pod_definition.html
src/templates/workflow/confirm.html
src/templates/workflow/viewport-base.html
src/workflow/models.py
src/workflow/resource_bundle_workflow.py

index 3d32c78..8b2fcb3 100644 (file)
@@ -17,6 +17,7 @@ from api.models import (
     HardwareConfig,
     NetworkConfig,
     SoftwareConfig,
+    AccessConfig,
     AccessRelation,
     SoftwareRelation,
     HostHardwareRelation,
@@ -33,6 +34,7 @@ admin.site.register(OpnfvApiConfig)
 admin.site.register(HardwareConfig)
 admin.site.register(NetworkConfig)
 admin.site.register(SoftwareConfig)
+admin.site.register(AccessConfig)
 admin.site.register(AccessRelation)
 admin.site.register(SoftwareRelation)
 admin.site.register(HostHardwareRelation)
index 78ec920..b6bd79f 100644 (file)
@@ -652,7 +652,7 @@ class JobFactory(object):
                     revoke=False,
                     job=job,
                     context={
-                        "key": user.userprofile.ssh_public_key.read(),
+                        "key": user.userprofile.ssh_public_key.open().read().decode(encoding="UTF-8"),
                         "hosts": [host.labid for host in hosts]
                     }
                 )
index 3e0aacd..b1eec86 100644 (file)
         grid-template-columns: 33% 34% 33%;
     }
 </style>
-<script type="text/javascript">
-    function cwf(wf_type){
-        document.getElementById('id_workflow').selectedIndex = wf_type;
-        document.getElementById('wf_selection_form').submit();
-    }
-</script>
 <div class='wf_create_div'>
 <button class="wf_create btn" onclick="cwf(0)">Create a Booking</button>
 <button class="wf_create btn" onclick="cwf(1)">Create a Pod</button>
index 389ff6d..b458842 100644 (file)
 {% endblock content %}
 
 {% block onleave %}
-document.getElementById("resource_meta_form").submit();
+var ajaxForm = $("#resource_meta_form");
+var formData = ajaxForm.serialize();
+req = new XMLHttpRequest();
+req.open("POST", "/wf/workflow/", false);
+req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+req.onerror = function() { alert("problem submitting form"); }
+req.send(formData);
 {% endblock %}
index ab9dfb3..b2b4998 100644 (file)
@@ -596,7 +596,6 @@ function submitForm() {
     var input_elem = document.getElementById("hidden_xml_input");
     var s = encodeGraph(currentGraph);
     input_elem.value = s;
-    //form.submit();
     req = new XMLHttpRequest();
     req.open("POST", "/wf/workflow/", false);
     req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
index 555fa56..4f2616e 100644 (file)
         req.send(formData);
     }
 
+    function submitForm()
+    {
+        var form = $("#confirmation_form");
+        var formData = form.serialize();
+        var req = new XMLHttpRequest();
+        req.open("POST", "/wf/workflow/", false);
+        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+        req.onerror = function() { alert("problem submitting confirmation"); }
+        req.onreadystatechange = function() { if(req.readyState === 4 ) { delete_manager(); } }
+        req.send(formData);
+    }
+
+
     function formconfirm()
     {
         select.value = "True";
-        document.getElementById("confirmation_form").submit();
+        submitForm();
     }
     function formcancel()
     {
         select.value = "False";
-        document.getElementById("confirmation_form").submit();
+        submitForm();
     }
 
     var confirmed = {{bypassed|default:"false"}};
 
 function fixVlans() {
     document.getElementById("vlan_input").value = "True";
-    document.getElementById("vlan_form").submit();
+    var form = $("#vlan_form");
+    var formData = form.serialize();
+    var req = new XMLHttpRequest();
+    req.open("POST", "/wf/workflow/", false);
+    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+    req.onerror = function() { alert("problem submitting form"); }
+    req.onreadystatechange = function() { //replaces current page with response
+        if(req.readyState === 4 ) {
+            document.open();
+            document.write(req.responseText);
+            document.close();
+        }
+    }
+    req.send(formData);
 }
 var problem = {{vlan_warning|default:'false'}};
 if(problem){
@@ -121,5 +147,4 @@ if(problem){
 {% endblock element_messages %}
 {% endblock content %}
 {% block onleave %}
-//document.getElementById("confirmation_form").submit();
 {% endblock %}
index fd9b638..37eff27 100644 (file)
@@ -14,6 +14,9 @@
         height: calc(100% - 170px);
 
     }
+    .go_btn_disabled{
+            background-color: #ffffff;
+    }
     .go_forward{
         right: 0px;
         border-left: none;
     function update_breadcrumbs(meta_json) {
         step = meta_json['active'];
         page_count = meta_json['steps'].length;
+        if( step == 0 )
+        {
+                var btn = document.getElementById("gob");
+                btn.classList.add("go_btn_disabled");
+                btn.disabled = true;
+        }
+        else
+        {
+                var btn = document.getElementById("gob");
+                btn.classList.remove("go_btn_disabled");
+                btn.disabled = false;
+        }
+        if( step == page_count - 1 )
+        {
+                var btn = document.getElementById("gof");
+                btn.classList.add("go_btn_disabled");
+                btn.disabled = true;
+        }
+        else
+        {
+                var btn = document.getElementById("gof");
+                btn.classList.remove("go_btn_disabled");
+                btn.disabled = false;
+        }
         //remove all children of breadcrumbs so we can redraw
         var container = document.getElementById("breadcrumbs");
         while(container.firstChild){
index 6a8eca1..73a142e 100644 (file)
@@ -26,13 +26,11 @@ from booking.models import Booking
 class BookingAuthManager():
     LFN_PROJECTS = ["opnfv"]  # TODO
 
-    def parse_url(self, info_url):
-        """
-        will return the PTL in the INFO file on success, or None
-        """
+    def parse_github_url(self, url):
+        project_leads = []
         try:
-            parts = info_url.split("/")
-            if parts[0].find("http") > -1:  # the url include http(s)://
+            parts = url.split("/")
+            if "http" in parts[0]:  # the url include http(s)://
                 parts = parts[2:]
             if parts[-1] != "INFO.yaml":
                 return None
@@ -47,13 +45,84 @@ class BookingAuthManager():
             info_file = requests.get(url, timeout=15).text
             info_parsed = yaml.load(info_file)
             ptl = info_parsed.get('project_lead')
-            if not ptl:
+            if ptl:
+                project_leads.append(ptl)
+            sub_ptl = info_parsed.get("subproject_lead")
+            if sub_ptl:
+                project_leads.append(sub_ptl)
+
+        except Exception:
+            pass
+
+        return project_leads
+
+    def parse_gerrit_url(self, url):
+        project_leads = []
+        try:
+            parts = url.split("/")
+            if "http" in parts[0]:  # the url include http(s)://
+                parts = parts[2:]
+            if "f=INFO.yaml" not in parts[-1].split(";"):
+                return None
+            if "gerrit.opnfv.org" not in parts[0]:
                 return None
-            return ptl
+            # now to download and parse file
+            url = "https://" + "/".join(parts)
+            info_file = requests.get(url, timeout=15).text
+            info_parsed = yaml.load(info_file)
+            ptl = info_parsed.get('project_lead')
+            if ptl:
+                project_leads.append(ptl)
+            sub_ptl = info_parsed.get("subproject_lead")
+            if sub_ptl:
+                project_leads.append(sub_ptl)
 
         except Exception:
             return None
 
+        return project_leads
+
+    def parse_opnfv_git_url(self, url):
+        project_leads = []
+        try:
+            parts = url.split("/")
+            if "http" in parts[0]:  # the url include http(s)://
+                parts = parts[2:]
+            if "INFO.yaml" not in parts[-1]:
+                return None
+            if "git.opnfv.org" not in parts[0]:
+                return None
+            if parts[-2] == "tree":
+                parts[-2] = "plain"
+            # now to download and parse file
+            url = "https://" + "/".join(parts)
+            info_file = requests.get(url, timeout=15).text
+            info_parsed = yaml.load(info_file)
+            ptl = info_parsed.get('project_lead')
+            if ptl:
+                project_leads.append(ptl)
+            sub_ptl = info_parsed.get("subproject_lead")
+            if sub_ptl:
+                project_leads.append(sub_ptl)
+
+        except Exception:
+            return None
+
+        return project_leads
+
+    def parse_url(self, info_url):
+        """
+        will return the PTL in the INFO file on success, or None
+        """
+        if "github" in info_url:
+            return self.parse_github_url(info_url)
+
+        if "gerrit.opnfv.org" in info_url:
+            return self.parse_gerrit_url(info_url)
+
+        if "git.opnfv.org" in info_url:
+            return self.parse_opnfv_git_url(info_url)
+
     def booking_allowed(self, booking, repo):
         """
         This is the method that will have to change whenever the booking policy changes in the Infra
index 712c92b..11386f9 100644 (file)
@@ -131,9 +131,12 @@ class Define_Hardware(WorkflowStep):
         try:
             self.form = HardwareDefinitionForm(request.POST)
             if self.form.is_valid():
-                self.update_models(self.form.cleaned_data)
-                self.update_confirmation()
-                self.metastep.set_valid("Step Completed")
+                if len(json.loads(self.form.cleaned_data['filter_field']).labs) != 1:
+                    self.metastep.set_invalid("Please select one lab")
+                else:
+                    self.update_models(self.form.cleaned_data)
+                    self.update_confirmation()
+                    self.metastep.set_valid("Step Completed")
             else:
                 self.metastep.set_invalid("Please complete the fields highlighted in red to continue")
                 pass