all lists on lists.proxmox.com
 help / color / mirror / Atom feed
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





      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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal