summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2012-05-23 10:47:13 -0400
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2012-05-23 10:47:13 -0400
commit4c4534c2302c869f5f8258eb7107dcf531e0edc7 (patch)
tree42c98b2d2540f93d32a389dce7b9ce6b116bccdd
parentff5f8989262f9c3c449bd68b459fec8e955f34c9 (diff)
downloadbcfg2-4c4534c2302c869f5f8258eb7107dcf531e0edc7.tar.gz
bcfg2-4c4534c2302c869f5f8258eb7107dcf531e0edc7.tar.bz2
bcfg2-4c4534c2302c869f5f8258eb7107dcf531e0edc7.zip
added ability to specify arbitrary repository options to Packages
-rw-r--r--doc/server/plugins/generators/packages.txt30
-rw-r--r--schemas/packages.xsd7
-rw-r--r--src/lib/Server/Plugins/Packages/Source.py13
-rw-r--r--src/lib/Server/Plugins/Packages/Yum.py7
4 files changed, 56 insertions, 1 deletions
diff --git a/doc/server/plugins/generators/packages.txt b/doc/server/plugins/generators/packages.txt
index 76454b8f5..54e92f1f6 100644
--- a/doc/server/plugins/generators/packages.txt
+++ b/doc/server/plugins/generators/packages.txt
@@ -182,6 +182,36 @@ There is no need to specify ``<GPGKey>`` tags for :ref:`Pulp sources
<pulp-source-support>`; that data is pulled directly from the Pulp
REST API.
+Arbitrary Repo Options
+----------------------
+
+.. versionadded:: 1.2.3
+
+You can specify arbitrary options to be added to the repository config
+on the server side, if you are using the native yum libraries, and on
+the client side if you are using the ability of Packages to
+automatically generate your Yum config. To do this, add an
+``<Options>`` tag to a Source; all of its attributes will be added
+verbatim to the repository in the generated config. For instance::
+
+ <Source type="yum" rawurl="http://mirror.example.com/centos-6-os">
+ <Arch>x86_64</Arch>
+ <Options proxy="http://proxy.example.com"/>
+ </Source>
+
+If you are using native yum libraries and need to set options only on
+the Bcfg2 server, you can set the ``serveronly`` attribute to "true";
+or, if you need to set options only on the client, you can set the
+``clientonly`` attribute to "true". For instance, if your Bcfg2
+server needed to use a proxy to access a repo, and you wanted to
+expire metadata caches very quickly on the client, you could do::
+
+ <Source type="yum" rawurl="http://mirror.example.com/centos-6-os">
+ <Arch>x86_64</Arch>
+ <Options serveronly="true" proxy="http://proxy.example.com"/>
+ <Options clientonly="true" metadata_expire="0"/>
+ </Source>
+
.. _packages-exampleusage:
Example usage
diff --git a/schemas/packages.xsd b/schemas/packages.xsd
index c29a85ecf..c4252194f 100644
--- a/schemas/packages.xsd
+++ b/schemas/packages.xsd
@@ -18,11 +18,18 @@
</xsd:restriction>
</xsd:simpleType>
+ <xsd:complexType name="RepoOptionsType">
+ <xsd:attribute type="xsd:boolean" name="serveronly"/>
+ <xsd:attribute type="xsd:boolean" name="clientonly"/>
+ <xsd:anyAttribute processContents="lax"/>
+ </xsd:complexType>
+
<xsd:complexType name="sourceType">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="Component" type="xsd:string"/>
<xsd:element name="Arch" type="xsd:string"/>
<xsd:element name="GPGKey" type="xsd:string"/>
+ <xsd:element name="Options" type="RepoOptionsType"/>
<xsd:choice>
<xsd:element name="Blacklist" type="xsd:string"/>
<xsd:element name="Whitelist" type="xsd:string"/>
diff --git a/src/lib/Server/Plugins/Packages/Source.py b/src/lib/Server/Plugins/Packages/Source.py
index 88d47fb3e..627ff561d 100644
--- a/src/lib/Server/Plugins/Packages/Source.py
+++ b/src/lib/Server/Plugins/Packages/Source.py
@@ -49,7 +49,18 @@ class Source(Bcfg2.Server.Plugin.Debuggable):
for key, tag in [('components', 'Component'), ('arches', 'Arch'),
('blacklist', 'Blacklist'),
('whitelist', 'Whitelist')]:
- self.__dict__[key] = [item.text for item in xsource.findall(tag)]
+ setattr(self, key, [item.text for item in xsource.findall(tag)])
+ self.server_options = dict()
+ self.client_options = dict()
+ opts = xsource.findall("Options")
+ for el in opts:
+ repoopts = dict([(k, v)
+ for k, v in el.attrib.items()
+ if k != "clientonly" and k != "serveronly"])
+ if el.get("clientonly", "false").lower() == "false":
+ self.server_options.update(repoopts)
+ if el.get("serveronly", "false").lower() == "false":
+ self.client_options.update(repoopts)
self.gpgkeys = [el.text for el in xsource.findall("GPGKey")]
diff --git a/src/lib/Server/Plugins/Packages/Yum.py b/src/lib/Server/Plugins/Packages/Yum.py
index 44ff1c272..7fe169fc8 100644
--- a/src/lib/Server/Plugins/Packages/Yum.py
+++ b/src/lib/Server/Plugins/Packages/Yum.py
@@ -204,6 +204,13 @@ class YumCollection(Collection):
config.set(reponame, "includepkgs",
" ".join(source.whitelist))
+ if raw:
+ opts = source.server_options
+ else:
+ opts = source.client_options
+ for opt, val in opts.items():
+ config.set(reponame, opt, val)
+
if raw:
return config
else: