From: Fabian Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH proxmox-apt 2/2] standard repo detection: handle alternative URI for PVE repos
Date: Fri, 16 Jul 2021 14:36:02 +0200 [thread overview]
Message-ID: <20210716123602.82090-3-f.ebner@proxmox.com> (raw)
In-Reply-To: <20210716123602.82090-1-f.ebner@proxmox.com>
For PVE, URIs without the final "/pve" are also valid.
Reported in the community forum:
https://forum.proxmox.com/threads/pve-7-0-9-no-proxmox-ve-repository-enabled.92427/
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---
src/repositories/repository.rs | 19 +++++-----
src/repositories/standard.rs | 42 ++++++++++++++++------
tests/repositories.rs | 14 ++++++++
tests/sources.list.d.expected/pve-alt.list | 8 +++++
tests/sources.list.d/pve-alt.list | 6 ++++
5 files changed, 70 insertions(+), 19 deletions(-)
create mode 100644 tests/sources.list.d.expected/pve-alt.list
create mode 100644 tests/sources.list.d/pve-alt.list
diff --git a/src/repositories/repository.rs b/src/repositories/repository.rs
index 4e1ea6e..b56ec47 100644
--- a/src/repositories/repository.rs
+++ b/src/repositories/repository.rs
@@ -271,14 +271,17 @@ impl APTRepository {
/// Checks if the repository is the one referenced by the handle.
pub fn is_referenced_repository(&self, handle: APTRepositoryHandle, product: &str) -> bool {
- let (package_type, uri, component) = handle.info(product);
-
- self.types.contains(&package_type)
- && self
- .uris
- .iter()
- .any(|self_uri| self_uri.trim_end_matches('/') == uri)
- && self.components.contains(&component)
+ let (package_type, handle_uris, component) = handle.info(product);
+
+ let mut found_uri = false;
+
+ for uri in self.uris.iter() {
+ let uri = uri.trim_end_matches('/');
+
+ found_uri = found_uri || handle_uris.iter().any(|handle_uri| handle_uri == uri);
+ }
+
+ self.types.contains(&package_type) && found_uri && self.components.contains(&component)
}
/// Check if a variant of the given suite is configured in this repository
diff --git a/src/repositories/standard.rs b/src/repositories/standard.rs
index 463e735..a287f91 100644
--- a/src/repositories/standard.rs
+++ b/src/repositories/standard.rs
@@ -163,42 +163,62 @@ impl APTRepositoryHandle {
}
}
- /// Get package type, URI and the component associated with the handle.
- pub fn info(self, product: &str) -> (APTRepositoryPackageType, String, String) {
+ /// Get package type, possible URIs and the component associated with the handle.
+ ///
+ /// The first URI is the preferred one.
+ pub fn info(self, product: &str) -> (APTRepositoryPackageType, Vec<String>, String) {
match self {
APTRepositoryHandle::Enterprise => (
APTRepositoryPackageType::Deb,
- format!("https://enterprise.proxmox.com/debian/{}", product),
+ match product {
+ "pve" => vec![
+ "https://enterprise.proxmox.com/debian/pve".to_string(),
+ "https://enterprise.proxmox.com/debian".to_string(),
+ ],
+ _ => vec![format!("https://enterprise.proxmox.com/debian/{}", product)],
+ },
format!("{}-enterprise", product),
),
APTRepositoryHandle::NoSubscription => (
APTRepositoryPackageType::Deb,
- format!("http://download.proxmox.com/debian/{}", product),
+ match product {
+ "pve" => vec![
+ "http://download.proxmox.com/debian/pve".to_string(),
+ "http://download.proxmox.com/debian".to_string(),
+ ],
+ _ => vec![format!("http://download.proxmox.com/debian/{}", product)],
+ },
format!("{}-no-subscription", product),
),
APTRepositoryHandle::Test => (
APTRepositoryPackageType::Deb,
- format!("http://download.proxmox.com/debian/{}", product),
+ match product {
+ "pve" => vec![
+ "http://download.proxmox.com/debian/pve".to_string(),
+ "http://download.proxmox.com/debian".to_string(),
+ ],
+ _ => vec![format!("http://download.proxmox.com/debian/{}", product)],
+ },
format!("{}test", product),
),
APTRepositoryHandle::CephPacific => (
APTRepositoryPackageType::Deb,
- "http://download.proxmox.com/debian/ceph-pacific".to_string(),
+ vec!["http://download.proxmox.com/debian/ceph-pacific".to_string()],
"main".to_string(),
),
APTRepositoryHandle::CephPacificTest => (
APTRepositoryPackageType::Deb,
- "http://download.proxmox.com/debian/ceph-pacific".to_string(),
+ vec!["http://download.proxmox.com/debian/ceph-pacific".to_string()],
"test".to_string(),
),
APTRepositoryHandle::CephOctopus => (
APTRepositoryPackageType::Deb,
- "http://download.proxmox.com/debian/ceph-octopus".to_string(),
+ vec!["http://download.proxmox.com/debian/ceph-octopus".to_string()],
"main".to_string(),
),
APTRepositoryHandle::CephOctopusTest => (
APTRepositoryPackageType::Deb,
- "http://download.proxmox.com/debian/ceph-octopus".to_string(),
+ vec!["http://download.proxmox.com/debian/ceph-octopus".to_string()],
"test".to_string(),
),
}
@@ -209,11 +229,11 @@ impl APTRepositoryHandle {
/// An URI in the result is not '/'-terminated (under the assumption that no valid
/// product name is).
pub fn to_repository(self, product: &str, suite: &str) -> APTRepository {
- let (package_type, uri, component) = self.info(product);
+ let (package_type, uris, component) = self.info(product);
APTRepository {
types: vec![package_type],
- uris: vec![uri],
+ uris: vec![uris.into_iter().next().unwrap()],
suites: vec![suite.to_string()],
components: vec![component],
options: vec![],
diff --git a/tests/repositories.rs b/tests/repositories.rs
index 67b0255..6435671 100644
--- a/tests/repositories.rs
+++ b/tests/repositories.rs
@@ -358,5 +358,19 @@ fn test_standard_repositories() -> Result<(), Error> {
assert_eq!(std_repos, expected);
+ let pve_alt_list = read_dir.join("pve-alt.list");
+ let mut file = APTRepositoryFile::new(&pve_alt_list)?.unwrap();
+ file.parse()?;
+
+ let file_vec = vec![file];
+
+ expected[0].status = Some(true);
+ expected[1].status = Some(true);
+ expected[2].status = Some(false);
+
+ let std_repos = standard_repositories("pve", &file_vec);
+
+ assert_eq!(std_repos, expected);
+
Ok(())
}
diff --git a/tests/sources.list.d.expected/pve-alt.list b/tests/sources.list.d.expected/pve-alt.list
new file mode 100644
index 0000000..f4834e7
--- /dev/null
+++ b/tests/sources.list.d.expected/pve-alt.list
@@ -0,0 +1,8 @@
+deb https://enterprise.proxmox.com/debian bullseye pve-enterprise
+
+deb http://download.proxmox.com/debian/ bullseye pve-no-subscription
+
+# deb http://download.proxmox.com/debian bullseye pvetest
+
+deb-src http://download.proxmox.com/debian bullseye pvetest
+
diff --git a/tests/sources.list.d/pve-alt.list b/tests/sources.list.d/pve-alt.list
new file mode 100644
index 0000000..0afd422
--- /dev/null
+++ b/tests/sources.list.d/pve-alt.list
@@ -0,0 +1,6 @@
+deb https://enterprise.proxmox.com/debian bullseye pve-enterprise
+
+deb http://download.proxmox.com/debian/ bullseye pve-no-subscription
+
+# deb http://download.proxmox.com/debian bullseye pvetest
+deb-src http://download.proxmox.com/debian bullseye pvetest
--
2.30.2
prev parent reply other threads:[~2021-07-16 12:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-16 12:36 [pve-devel] [PATCH proxmox-apt 0/2] fix detection for PVE Fabian Ebner
2021-07-16 12:36 ` [pve-devel] [PATCH proxmox-apt 1/2] bump proxmox dependency Fabian Ebner
2021-07-16 12:36 ` Fabian Ebner [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210716123602.82090-3-f.ebner@proxmox.com \
--to=f.ebner@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.