template-instantiate-user-attributes.patch
opennebula-3.8.1/include/RequestManagerVMTemplate.h 2012-12-16 16:30:54.000000000 -0500 | ||
---|---|---|
57 | 57 |
VMTemplateInstantiate(): |
58 | 58 |
RequestManagerVMTemplate("TemplateInstantiate", |
59 | 59 |
"Instantiates a new virtual machine using a template", |
60 |
"A:sis") |
|
60 |
"A:siss")
|
|
61 | 61 |
{ |
62 | 62 |
auth_op = AuthRequest::USE; |
63 | 63 |
}; |
opennebula-3.8.1/include/Template.h 2012-12-16 19:47:55.000000000 -0500 | ||
---|---|---|
283 | 283 |
*/ |
284 | 284 |
int from_xml_node(const xmlNodePtr node); |
285 | 285 |
|
286 |
/** |
|
287 |
* Merge attributes from another template |
|
288 |
* @param from_tmpl the template to be merged |
|
289 |
* @param error_str string describing the error |
|
290 |
* @return 0 on success. |
|
291 |
*/ |
|
292 |
int merge(const Template * from_tmpl, string& error_str); |
|
293 |
|
|
286 | 294 |
protected: |
287 | 295 |
/** |
288 | 296 |
* The template attributes |
opennebula-3.8.1/src/rm/RequestManagerVMTemplate.cc 2012-12-17 00:20:18.000000000 -0500 | ||
---|---|---|
27 | 27 |
int id = xmlrpc_c::value_int(paramList.getInt(1)); |
28 | 28 |
string name = xmlrpc_c::value_string(paramList.getString(2)); |
29 | 29 |
|
30 |
// optional parameter |
|
31 |
string str_uattrs; |
|
32 |
try { |
|
33 |
str_uattrs = xmlrpc_c::value_string(paramList.getString(3)); |
|
34 |
} catch (...) { } |
|
35 |
|
|
30 | 36 |
int rc, vid; |
31 | 37 |
|
32 | 38 |
PoolObjectAuth perms; |
... | ... | |
38 | 44 |
VirtualMachineTemplate * tmpl; |
39 | 45 |
VMTemplate * rtmpl; |
40 | 46 |
|
47 |
VirtualMachineTemplate uattrs; |
|
48 |
|
|
41 | 49 |
string error_str; |
42 | 50 |
string aname; |
43 | 51 |
|
... | ... | |
58 | 66 |
|
59 | 67 |
rtmpl->unlock(); |
60 | 68 |
|
69 |
// Parse user supplied attributes |
|
70 |
rc = uattrs.parse_str_or_xml(str_uattrs, error_str); |
|
71 |
|
|
72 |
if ( rc != 0 ) |
|
73 |
{ |
|
74 |
failure_response(INTERNAL, error_str, att); |
|
75 |
delete tmpl; |
|
76 |
|
|
77 |
return; |
|
78 |
} |
|
79 |
|
|
61 | 80 |
// Check template for restricted attributes, but only if the Template owner |
62 | 81 |
// is not oneadmin |
63 | 82 |
|
... | ... | |
78 | 97 |
} |
79 | 98 |
} |
80 | 99 |
|
100 |
// Check user attributes for restricted attributes, but only if the Request user |
|
101 |
// is not oneadmin |
|
102 |
|
|
103 |
if ( att.uid != UserPool::ONEADMIN_ID && att.gid != GroupPool::ONEADMIN_ID ) |
|
104 |
{ |
|
105 |
if (uattrs.check(aname)) |
|
106 |
{ |
|
107 |
ostringstream oss; |
|
108 |
|
|
109 |
oss << "User Attributes includes a restricted attribute " << aname; |
|
110 |
|
|
111 |
failure_response(AUTHORIZATION, |
|
112 |
authorization_error(oss.str(), att), |
|
113 |
att); |
|
114 |
|
|
115 |
delete tmpl; |
|
116 |
return; |
|
117 |
} |
|
118 |
} |
|
119 |
|
|
120 |
// Merge user attributes into template |
|
121 |
rc = tmpl->merge(&uattrs, error_str); |
|
122 |
|
|
123 |
if ( rc != 0 ) |
|
124 |
{ |
|
125 |
failure_response(INTERNAL, error_str, att); |
|
126 |
delete tmpl; |
|
127 |
|
|
128 |
return; |
|
129 |
} |
|
130 |
|
|
81 | 131 |
tmpl->erase("NAME"); |
82 | 132 |
tmpl->set(new SingleAttribute("NAME",name)); |
83 | 133 |
|
opennebula-3.8.1/src/template/Template.cc 2012-12-17 00:09:24.000000000 -0500 | ||
---|---|---|
635 | 635 |
/* ------------------------------------------------------------------------ */ |
636 | 636 |
/* ------------------------------------------------------------------------ */ |
637 | 637 |
|
638 |
int Template::merge(const Template * from_tmpl, string& error_str) |
|
639 |
{ |
|
640 |
multimap<string,Attribute *>::const_iterator it; |
|
641 |
|
|
642 |
for (it = from_tmpl->attributes.begin(); it != from_tmpl->attributes.end(); ++it) { |
|
643 |
|
|
644 |
// Get the attribute to be replaced |
|
645 |
vector<Attribute*> attrs; |
|
646 |
get(it->first, attrs); |
|
647 |
|
|
648 |
// Insert if attribute does not exist |
|
649 |
if ( attrs.size() == 0 ) |
|
650 |
{ |
|
651 |
attributes.insert(make_pair(it->first,(it->second)->clone())); |
|
652 |
continue; |
|
653 |
} |
|
654 |
|
|
655 |
Attribute* attr = attrs[0]; |
|
656 |
|
|
657 |
if (attr->type() != it->second->type()) |
|
658 |
{ |
|
659 |
ostringstream oss; |
|
660 |
oss << "Cannot merge attributes of different types " << it->first; |
|
661 |
error_str = oss.str(); |
|
662 |
return -1; |
|
663 |
} |
|
664 |
|
|
665 |
if (attr->type() == Attribute::SIMPLE) |
|
666 |
{ |
|
667 |
// Replace an existing Simple Attribute |
|
668 |
((SingleAttribute*) attr)->replace( ((SingleAttribute*) it->second)->value()); |
|
669 |
continue; |
|
670 |
} |
|
671 |
else |
|
672 |
{ |
|
673 |
// Replace values of an existing Vector Attribute |
|
674 |
const map<string,string> values = ((VectorAttribute*) it->second)->value(); |
|
675 |
|
|
676 |
map<string,string>::const_iterator it; |
|
677 |
|
|
678 |
for (it = values.begin(); it != values.end(); ++it) |
|
679 |
{ |
|
680 |
((VectorAttribute*) attr)->replace(it->first, it->second); |
|
681 |
} |
|
682 |
} |
|
683 |
} |
|
684 |
|
|
685 |
return 0; |
|
686 |
} |
|
687 |
|
|
688 |
/* ------------------------------------------------------------------------ */ |
|
689 |
/* ------------------------------------------------------------------------ */ |
|
690 |
|
|
638 | 691 |
void Template::rebuild_attributes(const xmlNode * root_element) |
639 | 692 |
{ |
640 | 693 |
xmlNode * cur_node = 0; |