]> git.proxmox.com Git - proxmox-backup.git/commitdiff
tape: rename changer_id to label_text
authorDietmar Maurer <dietmar@proxmox.com>
Wed, 13 Jan 2021 12:26:59 +0000 (13:26 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Wed, 13 Jan 2021 12:26:59 +0000 (13:26 +0100)
19 files changed:
src/api2/tape/backup.rs
src/api2/tape/changer.rs
src/api2/tape/drive.rs
src/api2/tape/media.rs
src/api2/tape/restore.rs
src/api2/types/tape/changer.rs
src/api2/types/tape/media.rs
src/bin/proxmox-tape.rs
src/bin/proxmox_tape/changer.rs
src/bin/proxmox_tape/media.rs
src/tape/changer/email.rs
src/tape/changer/mod.rs
src/tape/drive/mod.rs
src/tape/drive/virtual_tape.rs
src/tape/file_formats.rs
src/tape/inventory.rs
src/tape/media_pool.rs
src/tape/online_status_map.rs
src/tape/pool_writer.rs

index 8d80043b7803af4e4129ac8f14a9d13d109caf49..56622e64cbda8f31e8a98886b879e8236f5701b9 100644 (file)
@@ -170,7 +170,7 @@ fn update_media_online_status(drive: &str) -> Result<bool, Error> {
 
         has_changer = true;
 
-        let changer_id_list = changer.online_media_changer_ids()?;
+        let label_text_list = changer.online_media_label_texts()?;
 
         let status_path = Path::new(TAPE_STATUS_DIR);
         let mut inventory = Inventory::load(status_path)?;
@@ -179,7 +179,7 @@ fn update_media_online_status(drive: &str) -> Result<bool, Error> {
             &config,
             &mut inventory,
             &changer_name,
-            &changer_id_list,
+            &label_text_list,
         )?;
     }
 
index b01cce947880231f55409af5c6805c2471351de9..43545a668be0016d80c5ef4fb42babe3a8d54e97 100644 (file)
@@ -70,7 +70,7 @@ pub async fn get_status(name: String) -> Result<Vec<MtxStatusEntry>, Error> {
         let entry = MtxStatusEntry {
             entry_kind: MtxEntryKind::Drive,
             entry_id: id as u64,
-            changer_id: match &drive_status.status {
+            label_text: match &drive_status.status {
                 ElementStatus::Empty => None,
                 ElementStatus::Full => Some(String::new()),
                 ElementStatus::VolumeTag(tag) => Some(tag.to_string()),
@@ -88,7 +88,7 @@ pub async fn get_status(name: String) -> Result<Vec<MtxStatusEntry>, Error> {
                 MtxEntryKind::Slot
             },
             entry_id: id as u64 + 1,
-            changer_id: match &slot_status {
+            label_text: match &slot_status {
                 ElementStatus::Empty => None,
                 ElementStatus::Full => Some(String::new()),
                 ElementStatus::VolumeTag(tag) => Some(tag.to_string()),
index 410f1607576efc8dd362eec2f678434230d5aea5..f124b7c6b6cce4d45900887bd0c8ff8a4b7210d6 100644 (file)
@@ -70,7 +70,7 @@ use crate::{
             drive: {
                 schema: DRIVE_NAME_SCHEMA,
             },
-            "changer-id": {
+            "label-text": {
                 schema: MEDIA_LABEL_SCHEMA,
             },
         },
@@ -79,13 +79,13 @@ use crate::{
 /// Load media with specified label
 ///
 /// Issue a media load request to the associated changer device.
-pub async fn load_media(drive: String, changer_id: String) -> Result<(), Error> {
+pub async fn load_media(drive: String, label_text: String) -> Result<(), Error> {
 
     let (config, _digest) = config::drive::config()?;
 
     tokio::task::spawn_blocking(move || {
         let (mut changer, _) = required_media_changer(&config, &drive)?;
-        changer.load_media(&changer_id)
+        changer.load_media(&label_text)
     }).await?
 }
 
@@ -121,7 +121,7 @@ pub async fn load_slot(drive: String, source_slot: u64) -> Result<(), Error> {
             drive: {
                 schema: DRIVE_NAME_SCHEMA,
             },
-            "changer-id": {
+            "label-text": {
                 schema: MEDIA_LABEL_SCHEMA,
             },
         },
@@ -133,15 +133,15 @@ pub async fn load_slot(drive: String, source_slot: u64) -> Result<(), Error> {
     },
 )]
 /// Export media with specified label
-pub async fn export_media(drive: String, changer_id: String) -> Result<u64, Error> {
+pub async fn export_media(drive: String, label_text: String) -> Result<u64, Error> {
 
     let (config, _digest) = config::drive::config()?;
 
     tokio::task::spawn_blocking(move || {
         let (mut changer, changer_name) = required_media_changer(&config, &drive)?;
-        match changer.export_media(&changer_id)? {
+        match changer.export_media(&label_text)? {
             Some(slot) => Ok(slot),
-            None => bail!("media '{}' is not online (via changer '{}')", changer_id, changer_name),
+            None => bail!("media '{}' is not online (via changer '{}')", label_text, changer_name),
         }
     }).await?
 }
@@ -315,7 +315,7 @@ pub async fn eject_media(drive: String) -> Result<(), Error> {
             drive: {
                 schema: DRIVE_NAME_SCHEMA,
             },
-            "changer-id": {
+            "label-text": {
                 schema: MEDIA_LABEL_SCHEMA,
             },
             pool: {
@@ -337,7 +337,7 @@ pub async fn eject_media(drive: String) -> Result<(), Error> {
 pub fn label_media(
     drive: String,
     pool: Option<String>,
-    changer_id: String,
+    label_text: String,
     rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Value, Error> {
 
@@ -380,7 +380,7 @@ pub fn label_media(
 
             let ctime = proxmox::tools::time::epoch_i64();
             let label = MediaLabel {
-                changer_id: changer_id.to_string(),
+                label_text: label_text.to_string(),
                 uuid: Uuid::generate(),
                 ctime,
             };
@@ -405,13 +405,13 @@ fn write_media_label(
 
     if let Some(ref pool) = pool {
         // assign media to pool by writing special media set label
-        worker.log(format!("Label media '{}' for pool '{}'", label.changer_id, pool));
+        worker.log(format!("Label media '{}' for pool '{}'", label.label_text, pool));
         let set = MediaSetLabel::with_data(&pool, [0u8; 16].into(), 0, label.ctime);
 
         drive.write_media_set_label(&set)?;
         media_set_label = Some(set);
     } else {
-        worker.log(format!("Label media '{}' (no pool assignment)", label.changer_id));
+        worker.log(format!("Label media '{}' (no pool assignment)", label.label_text));
     }
 
     let media_id = MediaId { label, media_set_label };
@@ -482,7 +482,7 @@ pub async fn read_label(drive: String) -> Result<MediaIdFlat, Error> {
             Some(media_id) => {
                 let mut flat = MediaIdFlat {
                     uuid: media_id.label.uuid.to_string(),
-                    changer_id: media_id.label.changer_id.clone(),
+                    label_text: media_id.label.label_text.clone(),
                     ctime: media_id.label.ctime,
                     media_set_ctime: None,
                     media_set_uuid: None,
@@ -585,7 +585,7 @@ pub async fn inventory(
     tokio::task::spawn_blocking(move || {
         let (mut changer, changer_name) = required_media_changer(&config, &drive)?;
 
-        let changer_id_list = changer.online_media_changer_ids()?;
+        let label_text_list = changer.online_media_label_texts()?;
 
         let state_path = Path::new(TAPE_STATUS_DIR);
 
@@ -595,23 +595,23 @@ pub async fn inventory(
             &config,
             &mut inventory,
             &changer_name,
-            &changer_id_list,
+            &label_text_list,
         )?;
 
         let mut list = Vec::new();
 
-        for changer_id in changer_id_list.iter() {
-            if changer_id.starts_with("CLN") {
+        for label_text in label_text_list.iter() {
+            if label_text.starts_with("CLN") {
                 // skip cleaning unit
                 continue;
             }
 
-            let changer_id = changer_id.to_string();
+            let label_text = label_text.to_string();
 
-            if let Some(media_id) = inventory.find_media_by_changer_id(&changer_id) {
-                list.push(LabelUuidMap { changer_id, uuid: Some(media_id.label.uuid.to_string()) });
+            if let Some(media_id) = inventory.find_media_by_label_text(&label_text) {
+                list.push(LabelUuidMap { label_text, uuid: Some(media_id.label.uuid.to_string()) });
             } else {
-                list.push(LabelUuidMap { changer_id, uuid: None });
+                list.push(LabelUuidMap { label_text, uuid: None });
             }
         }
 
@@ -668,8 +668,8 @@ pub fn update_inventory(
 
             let (mut changer, changer_name) = required_media_changer(&config, &drive)?;
 
-            let changer_id_list = changer.online_media_changer_ids()?;
-            if changer_id_list.is_empty() {
+            let label_text_list = changer.online_media_label_texts()?;
+            if label_text_list.is_empty() {
                 worker.log(format!("changer device does not list any media labels"));
             }
 
@@ -677,42 +677,42 @@ pub fn update_inventory(
 
             let mut inventory = Inventory::load(state_path)?;
 
-            update_changer_online_status(&config, &mut inventory, &changer_name, &changer_id_list)?;
+            update_changer_online_status(&config, &mut inventory, &changer_name, &label_text_list)?;
 
-            for changer_id in changer_id_list.iter() {
-                if changer_id.starts_with("CLN") {
-                    worker.log(format!("skip cleaning unit '{}'", changer_id));
+            for label_text in label_text_list.iter() {
+                if label_text.starts_with("CLN") {
+                    worker.log(format!("skip cleaning unit '{}'", label_text));
                     continue;
                 }
 
-                let changer_id = changer_id.to_string();
+                let label_text = label_text.to_string();
 
                 if !read_all_labels.unwrap_or(false) {
-                    if let Some(_) = inventory.find_media_by_changer_id(&changer_id) {
-                        worker.log(format!("media '{}' already inventoried", changer_id));
+                    if let Some(_) = inventory.find_media_by_label_text(&label_text) {
+                        worker.log(format!("media '{}' already inventoried", label_text));
                         continue;
                     }
                 }
 
-                if let Err(err) = changer.load_media(&changer_id) {
-                    worker.warn(format!("unable to load media '{}' - {}", changer_id, err));
+                if let Err(err) = changer.load_media(&label_text) {
+                    worker.warn(format!("unable to load media '{}' - {}", label_text, err));
                     continue;
                 }
 
                 let mut drive = open_drive(&config, &drive)?;
                 match drive.read_label() {
                     Err(err) => {
-                        worker.warn(format!("unable to read label form media '{}' - {}", changer_id, err));
+                        worker.warn(format!("unable to read label form media '{}' - {}", label_text, err));
                     }
                     Ok(None) => {
-                        worker.log(format!("media '{}' is empty", changer_id));
+                        worker.log(format!("media '{}' is empty", label_text));
                     }
                     Ok(Some(media_id)) => {
-                        if changer_id != media_id.label.changer_id {
-                            worker.warn(format!("label changer ID missmatch ({} != {})", changer_id, media_id.label.changer_id));
+                        if label_text != media_id.label.label_text {
+                            worker.warn(format!("label text missmatch ({} != {})", label_text, media_id.label.label_text));
                             continue;
                         }
-                        worker.log(format!("inventorize media '{}' with uuid '{}'", changer_id, media_id.label.uuid));
+                        worker.log(format!("inventorize media '{}' with uuid '{}'", label_text, media_id.label.uuid));
                         inventory.store(media_id, false)?;
                     }
                 }
@@ -784,31 +784,31 @@ fn barcode_label_media_worker(
 
     let (mut changer, changer_name) = required_media_changer(&config, &drive)?;
 
-    let changer_id_list = changer.online_media_changer_ids()?;
+    let label_text_list = changer.online_media_label_texts()?;
 
     let state_path = Path::new(TAPE_STATUS_DIR);
 
     let mut inventory = Inventory::load(state_path)?;
 
-    update_changer_online_status(&config, &mut inventory, &changer_name, &changer_id_list)?;
+    update_changer_online_status(&config, &mut inventory, &changer_name, &label_text_list)?;
 
-    if changer_id_list.is_empty() {
+    if label_text_list.is_empty() {
         bail!("changer device does not list any media labels");
     }
 
-    for changer_id in changer_id_list {
-        if changer_id.starts_with("CLN") { continue; }
+    for label_text in label_text_list {
+        if label_text.starts_with("CLN") { continue; }
 
         inventory.reload()?;
-        if inventory.find_media_by_changer_id(&changer_id).is_some() {
-            worker.log(format!("media '{}' already inventoried (already labeled)", changer_id));
+        if inventory.find_media_by_label_text(&label_text).is_some() {
+            worker.log(format!("media '{}' already inventoried (already labeled)", label_text));
             continue;
         }
 
-        worker.log(format!("checking/loading media '{}'", changer_id));
+        worker.log(format!("checking/loading media '{}'", label_text));
 
-        if let Err(err) = changer.load_media(&changer_id) {
-            worker.warn(format!("unable to load media '{}' - {}", changer_id, err));
+        if let Err(err) = changer.load_media(&label_text) {
+            worker.warn(format!("unable to load media '{}' - {}", label_text, err));
             continue;
         }
 
@@ -817,7 +817,7 @@ fn barcode_label_media_worker(
 
         match drive.read_next_file() {
             Ok(Some(_file)) => {
-                worker.log(format!("media '{}' is not empty (erase first)", changer_id));
+                worker.log(format!("media '{}' is not empty (erase first)", label_text));
                 continue;
             }
             Ok(None) => { /* EOF mark at BOT, assume tape is empty */ },
@@ -825,7 +825,7 @@ fn barcode_label_media_worker(
                 if err.is_errno(nix::errno::Errno::ENOSPC) || err.is_errno(nix::errno::Errno::EIO) {
                     /* assume tape is empty */
                 } else {
-                    worker.warn(format!("media '{}' read error (maybe not empty - erase first)", changer_id));
+                    worker.warn(format!("media '{}' read error (maybe not empty - erase first)", label_text));
                     continue;
                 }
             }
@@ -833,7 +833,7 @@ fn barcode_label_media_worker(
 
         let ctime = proxmox::tools::time::epoch_i64();
         let label = MediaLabel {
-            changer_id: changer_id.to_string(),
+            label_text: label_text.to_string(),
             uuid: Uuid::generate(),
             ctime,
         };
index ee5afb8008b35e9632d7a96a07f83aa87cf51cea..cbbe80c5f4b75216c5f44365d45bd6b980735004 100644 (file)
@@ -112,7 +112,7 @@ pub async fn list_media(pool: Option<String>) -> Result<Vec<MediaListEntry>, Err
 
             list.push(MediaListEntry {
                 uuid: media.uuid().to_string(),
-                changer_id: media.changer_id().to_string(),
+                label_text: media.label_text().to_string(),
                 ctime: media.ctime(),
                 pool: Some(pool_name.to_string()),
                 location: media.location().clone(),
@@ -142,7 +142,7 @@ pub async fn list_media(pool: Option<String>) -> Result<Vec<MediaListEntry>, Err
             list.push(MediaListEntry {
                 uuid: media_id.label.uuid.to_string(),
                 ctime: media_id.label.ctime,
-                changer_id: media_id.label.changer_id.to_string(),
+                label_text: media_id.label.label_text.to_string(),
                 location,
                 status,
                 catalog: true, // empty, so we do not need a catalog
@@ -162,7 +162,7 @@ pub async fn list_media(pool: Option<String>) -> Result<Vec<MediaListEntry>, Err
 #[api(
     input: {
         properties: {
-            "changer-id": {
+            "label-text": {
                 schema: MEDIA_LABEL_SCHEMA,
             },
             force: {
@@ -174,21 +174,21 @@ pub async fn list_media(pool: Option<String>) -> Result<Vec<MediaListEntry>, Err
     },
 )]
 /// Destroy media (completely remove from database)
-pub fn destroy_media(changer_id: String, force: Option<bool>,) -> Result<(), Error> {
+pub fn destroy_media(label_text: String, force: Option<bool>,) -> Result<(), Error> {
 
     let force = force.unwrap_or(false);
 
     let status_path = Path::new(TAPE_STATUS_DIR);
     let mut inventory = Inventory::load(status_path)?;
 
-    let media_id = inventory.find_media_by_changer_id(&changer_id)
-        .ok_or_else(|| format_err!("no such media '{}'", changer_id))?;
+    let media_id = inventory.find_media_by_label_text(&label_text)
+        .ok_or_else(|| format_err!("no such media '{}'", label_text))?;
 
     if !force {
         if let Some(ref set) = media_id.media_set_label {
             let is_empty = set.uuid.as_ref() == [0u8;16];
             if !is_empty {
-                bail!("media '{}' contains data (please use 'force' flag to remove.", changer_id);
+                bail!("media '{}' contains data (please use 'force' flag to remove.", label_text);
             }
         }
     }
@@ -207,7 +207,7 @@ pub fn destroy_media(changer_id: String, force: Option<bool>,) -> Result<(), Err
             schema: MEDIA_POOL_NAME_SCHEMA,
             optional: true,
         },
-        "changer-id": {
+        "label-text": {
             schema: MEDIA_LABEL_SCHEMA,
             optional: true,
         },
@@ -236,7 +236,7 @@ pub fn destroy_media(changer_id: String, force: Option<bool>,) -> Result<(), Err
 /// Content list filter parameters
 pub struct MediaContentListFilter {
     pub pool: Option<String>,
-    pub changer_id: Option<String>,
+    pub label_text: Option<String>,
     pub media: Option<String>,
     pub media_set: Option<String>,
     pub backup_type: Option<String>,
@@ -278,8 +278,8 @@ pub fn list_content(
     for media_id in inventory.list_used_media() {
         let set = media_id.media_set_label.as_ref().unwrap();
 
-        if let Some(ref changer_id) = filter.changer_id {
-            if &media_id.label.changer_id != changer_id { continue; }
+        if let Some(ref label_text) = filter.label_text {
+            if &media_id.label.label_text != label_text { continue; }
         }
 
         if let Some(ref pool) = filter.pool {
@@ -314,7 +314,7 @@ pub fn list_content(
 
             list.push(MediaContentEntry {
                 uuid: media_id.label.uuid.to_string(),
-                changer_id: media_id.label.changer_id.to_string(),
+                label_text: media_id.label.label_text.to_string(),
                 pool: set.pool.clone(),
                 media_set_name: media_set_name.clone(),
                 media_set_uuid: set.uuid.to_string(),
index 843ac24351448230f19055a857894e1c2f2e6114..1131f181cd26ef46398129189b54f55b0a5f239c 100644 (file)
@@ -152,7 +152,7 @@ pub fn restore(
             worker.log(format!(
                 "Required media list: {}",
                 media_id_list.iter()
-                    .map(|media_id| media_id.label.changer_id.as_str())
+                    .map(|media_id| media_id.label.label_text.as_str())
                     .collect::<Vec<&str>>()
                     .join(";")
             ));
@@ -196,12 +196,12 @@ pub fn request_and_restore_media(
     match info.media_set_label {
         None => {
             bail!("missing media set label on media {} ({})",
-                  media_id.label.changer_id, media_id.label.uuid);
+                  media_id.label.label_text, media_id.label.uuid);
         }
         Some(ref set) => {
             if &set.uuid != media_set_uuid {
                 bail!("wrong media set label on media {} ({} != {})",
-                      media_id.label.changer_id, media_id.label.uuid,
+                      media_id.label.label_text, media_id.label.uuid,
                       media_set_uuid);
             }
         }
index c7acd381082c6000a3a30cb25520e400a4644e3f..dccaea6a77f62693c42861af5464f321f117cbbb 100644 (file)
@@ -87,7 +87,7 @@ pub enum MtxEntryKind {
         "entry-kind": {
             type: MtxEntryKind,
         },
-        "changer-id": {
+        "label-text": {
             schema: MEDIA_LABEL_SCHEMA,
             optional: true,
         },
@@ -102,7 +102,7 @@ pub struct MtxStatusEntry {
     pub entry_id: u64,
     /// The media label (volume tag) if the slot/drive is full
     #[serde(skip_serializing_if="Option::is_none")]
-    pub changer_id: Option<String>,
+    pub label_text: Option<String>,
     /// The slot the drive was loaded from
     #[serde(skip_serializing_if="Option::is_none")]
     pub loaded_slot: Option<u64>,
index da030aab2d952be2ab997dbf6db15723881df33a..3318e3a6106957739ac7f9246b941e7aa1a163d2 100644 (file)
@@ -21,8 +21,8 @@ use super::{
 #[serde(rename_all = "kebab-case")]
 /// Media list entry
 pub struct MediaListEntry {
-    /// Media changer ID
-    pub changer_id: String,
+    /// Media label text (or Barcode)
+    pub label_text: String,
     /// Media Uuid
     pub uuid: String,
     /// Creation time stamp
@@ -57,8 +57,8 @@ pub struct MediaListEntry {
 pub struct MediaIdFlat {
     /// Unique ID
     pub uuid: String,
-    /// Media Changer ID or Barcode
-    pub changer_id: String,
+    /// Media label text (or Barcode)
+    pub label_text: String,
     /// Creation time stamp
     pub ctime: i64,
     // All MediaSet properties are optional here
@@ -81,8 +81,8 @@ pub struct MediaIdFlat {
 #[serde(rename_all = "kebab-case")]
 /// Label with optional Uuid
 pub struct LabelUuidMap {
-    /// Changer ID (label)
-    pub changer_id: String,
+    /// Changer label text (or Barcode)
+    pub label_text: String,
     /// Associated Uuid (if any)
     pub uuid: Option<String>,
 }
@@ -92,8 +92,8 @@ pub struct LabelUuidMap {
 #[serde(rename_all = "kebab-case")]
 /// Media content list entry
 pub struct MediaContentEntry {
-    /// Media changer ID
-    pub changer_id: String,
+    /// Media label text (or Barcode)
+    pub label_text: String,
     /// Media Uuid
     pub uuid: String,
     /// Media set name
index 4850008a10e623bc390132568f87366773eb2c6a..ee35be23de21f998dc5aaf655a94c38f54e8d384 100644 (file)
@@ -42,7 +42,7 @@ use proxmox_backup::{
     },
     tape::{
         open_drive,
-        complete_media_changer_id,
+        complete_media_label_text,
         complete_media_set_uuid,
         file_formats::{
             PROXMOX_BACKUP_CONTENT_HEADER_MAGIC_1_0,
@@ -210,7 +210,7 @@ async fn eject_media(
                 schema: DRIVE_NAME_SCHEMA,
                 optional: true,
             },
-            "changer-id": {
+            "label-text": {
                 schema: MEDIA_LABEL_SCHEMA,
             },
         },
@@ -243,7 +243,7 @@ async fn load_media(
                 schema: DRIVE_NAME_SCHEMA,
                 optional: true,
             },
-            "changer-id": {
+            "label-text": {
                 schema: MEDIA_LABEL_SCHEMA,
             },
         },
@@ -351,7 +351,7 @@ async fn unload_media(
                 schema: DRIVE_NAME_SCHEMA,
                 optional: true,
             },
-            "changer-id": {
+            "label-text": {
                 schema: MEDIA_LABEL_SCHEMA,
             },
        },
@@ -411,7 +411,7 @@ async fn read_label(
     };
 
     let options = default_table_format_options()
-        .column(ColumnConfig::new("changer-id"))
+        .column(ColumnConfig::new("label-text"))
         .column(ColumnConfig::new("uuid"))
         .column(ColumnConfig::new("ctime").renderer(render_epoch))
         .column(ColumnConfig::new("pool"))
@@ -487,7 +487,7 @@ async fn inventory(
     };
 
     let options = default_table_format_options()
-        .column(ColumnConfig::new("changer-id"))
+        .column(ColumnConfig::new("label-text"))
         .column(ColumnConfig::new("uuid"))
         ;
 
@@ -950,9 +950,9 @@ fn main() {
         .insert(
             "load-media",
             CliCommand::new(&API_METHOD_LOAD_MEDIA)
-                .arg_param(&["changer-id"])
+                .arg_param(&["label-text"])
                 .completion_cb("drive", complete_drive_name)
-                .completion_cb("changer-id", complete_media_changer_id)
+                .completion_cb("label-text", complete_media_label_text)
         )
         .insert(
             "load-media-from-slot",
@@ -968,9 +968,9 @@ fn main() {
         .insert(
             "export-media",
             CliCommand::new(&API_METHOD_EXPORT_MEDIA)
-                .arg_param(&["changer-id"])
+                .arg_param(&["label-text"])
                 .completion_cb("drive", complete_drive_name)
-                .completion_cb("changer-id", complete_media_changer_id)
+                .completion_cb("label-text", complete_media_label_text)
         )
         ;
 
index 3a5494a5b0aeac0ff02a49062fe3a5acf8aee0a2..b54616de28e3be2d0fda3f9adb69cf9fef6fc03d 100644 (file)
@@ -233,7 +233,7 @@ async fn get_status(
         _ => unreachable!(),
     };
 
-    let render_changer_id = |value: &Value, _record: &Value| -> Result<String, Error> {
+    let render_label_text = |value: &Value, _record: &Value| -> Result<String, Error> {
         if value.is_null() {
             return Ok(String::new());
         }
@@ -250,7 +250,7 @@ async fn get_status(
         .sortby("entry-id", false)
         .column(ColumnConfig::new("entry-kind"))
         .column(ColumnConfig::new("entry-id"))
-        .column(ColumnConfig::new("changer-id").renderer(render_changer_id))
+        .column(ColumnConfig::new("label-text").renderer(render_label_text))
         .column(ColumnConfig::new("loaded-slot"))
         ;
 
index dd1118c698c51c03a50ce20972495f4bb7d70b13..4bd0474b99cb00cd7938eff917578866a4f31f70 100644 (file)
@@ -21,7 +21,7 @@ use proxmox_backup::{
         tape::media::MediaContentListFilter,
     },
     tape::{
-        complete_media_changer_id,
+        complete_media_label_text,
         complete_media_uuid,
         complete_media_set_uuid,
     },
@@ -41,14 +41,14 @@ pub fn media_commands() -> CommandLineInterface {
         .insert(
             "destroy",
             CliCommand::new(&api2::tape::media::API_METHOD_DESTROY_MEDIA)
-                .arg_param(&["changer-id"])
-                .completion_cb("changer-id", complete_media_changer_id)
+                .arg_param(&["label-text"])
+                .completion_cb("label-text", complete_media_label_text)
         )
         .insert(
             "content",
             CliCommand::new(&API_METHOD_LIST_CONTENT)
                 .completion_cb("pool", complete_pool_name)
-                .completion_cb("changer-id", complete_media_changer_id)
+                .completion_cb("label-text", complete_media_label_text)
                 .completion_cb("media", complete_media_uuid)
                 .completion_cb("media-set", complete_media_set_uuid)
         )
@@ -116,8 +116,8 @@ async fn list_media(
         .sortby("pool", false)
         .sortby("media-set-uuid", false)
         .sortby("seq-nr", false)
-        .sortby("changer-id", false)
-        .column(ColumnConfig::new("changer-id"))
+        .sortby("label-text", false)
+        .column(ColumnConfig::new("label-text"))
         .column(ColumnConfig::new("pool"))
         .column(ColumnConfig::new("media-set-name"))
         .column(ColumnConfig::new("seq-nr"))
@@ -165,7 +165,7 @@ fn list_content(
         .sortby("seq-nr", false)
         .sortby("snapshot", false)
         .sortby("backup-time", false)
-        .column(ColumnConfig::new("changer-id"))
+        .column(ColumnConfig::new("label-text"))
         .column(ColumnConfig::new("pool"))
         .column(ColumnConfig::new("media-set-name"))
         .column(ColumnConfig::new("seq-nr"))
index fcdb2f18f5d5fdff0c49963546f8dad45fbb47ba..9be0619639b955f50904ee0383493e8058866e3e 100644 (file)
@@ -5,18 +5,18 @@ use proxmox::tools::email::sendmail;
 /// Send email to a person to request a manual media change
 pub fn send_load_media_email(
     drive: &str,
-    changer_id: &str,
+    label_text: &str,
     to: &str,
 ) -> Result<(), Error> {
 
-    let subject = format!("Load Media '{}' request for drive '{}'", changer_id, drive);
+    let subject = format!("Load Media '{}' request for drive '{}'", label_text, drive);
 
     let mut text = String::new();
 
     text.push_str("Please insert the requested media into the backup drive.\n\n");
 
     text.push_str(&format!("Drive: {}\n", drive));
-    text.push_str(&format!("Media: {}\n", changer_id));
+    text.push_str(&format!("Media: {}\n", label_text));
 
     sendmail(
         &[to],
index 04565b183bcf9c39869530f5e911f3e02a58763f..6e2c5b5b8c2ba3a991c33a251dd8320f1b6f714e 100644 (file)
@@ -32,17 +32,17 @@ pub trait MediaChange {
     /// Load media from storage slot into drive
     fn load_media_from_slot(&mut self, slot: u64) -> Result<(), Error>;
 
-    /// Load media by changer-id into drive
+    /// Load media by label-text into drive
     ///
     /// This unloads first if the drive is already loaded with another media.
     ///
     /// Note: This refuses to load media inside import/export
     /// slots. Also, you cannot load cleaning units with this
     /// interface.
-    fn load_media(&mut self, changer_id: &str) -> Result<(), Error> {
+    fn load_media(&mut self, label_text: &str) -> Result<(), Error> {
 
-        if changer_id.starts_with("CLN") {
-            bail!("unable to load media '{}' (seems top be a a cleaning units)", changer_id);
+        if label_text.starts_with("CLN") {
+            bail!("unable to load media '{}' (seems top be a a cleaning units)", label_text);
         }
 
         let mut status = self.status()?;
@@ -52,10 +52,10 @@ pub trait MediaChange {
         // already loaded?
         for (i, drive_status) in status.drives.iter().enumerate() {
             if let ElementStatus::VolumeTag(ref tag) = drive_status.status {
-                if *tag == changer_id {
+                if *tag == label_text {
                     if i as u64 != self.drive_number() {
                         bail!("unable to load media '{}' - media in wrong drive ({} != {})",
-                              changer_id, i, self.drive_number());
+                              label_text, i, self.drive_number());
                     }
                     return Ok(()) // already loaded
                 }
@@ -76,9 +76,9 @@ pub trait MediaChange {
         let mut slot = None;
         for (i, (import_export, element_status)) in status.slots.iter().enumerate() {
             if let ElementStatus::VolumeTag(tag) = element_status {
-                if *tag == changer_id {
+                if *tag == label_text {
                     if *import_export {
-                        bail!("unable to load media '{}' - inside import/export slot", changer_id);
+                        bail!("unable to load media '{}' - inside import/export slot", label_text);
                     }
                     slot = Some(i+1);
                     break;
@@ -87,7 +87,7 @@ pub trait MediaChange {
         }
 
         let slot = match slot {
-            None => bail!("unable to find media '{}' (offline?)", changer_id),
+            None => bail!("unable to find media '{}' (offline?)", label_text),
             Some(slot) => slot,
         };
 
@@ -97,11 +97,11 @@ pub trait MediaChange {
     /// Unload media from drive (eject media if necessary)
     fn unload_media(&mut self, target_slot: Option<u64>) -> Result<(), Error>;
 
-    /// List online media changer IDs (barcodes)
+    /// List online media labels (label_text/barcodes)
     ///
-    /// List acessible (online) changer IDs. This does not include
+    /// List acessible (online) label texts. This does not include
     /// media inside import-export slots or cleaning media.
-    fn online_media_changer_ids(&mut self) -> Result<Vec<String>, Error> {
+    fn online_media_label_texts(&mut self) -> Result<Vec<String>, Error> {
         let status = self.status()?;
 
         let mut list = Vec::new();
@@ -166,13 +166,13 @@ pub trait MediaChange {
     /// By moving the media to an empty import-export slot. Returns
     /// Some(slot) if the media was exported. Returns None if the media is
     /// not online (already exported).
-    fn export_media(&mut self, changer_id: &str) -> Result<Option<u64>, Error> {
+    fn export_media(&mut self, label_text: &str) -> Result<Option<u64>, Error> {
         let status = self.status()?;
 
         let mut unload_from_drive = false;
         if let Some(drive_status) = status.drives.get(self.drive_number() as usize) {
             if let ElementStatus::VolumeTag(ref tag) = drive_status.status {
-                if tag == changer_id {
+                if tag == label_text {
                     unload_from_drive = true;
                 }
             }
@@ -189,7 +189,7 @@ pub trait MediaChange {
                 }
             } else {
                 if let ElementStatus::VolumeTag(ref tag) = element_status {
-                    if tag == changer_id {
+                    if tag == label_text {
                         from = Some(i as u64 + 1);
                     }
                 }
index 566b184f1b183405a8c353405d34880000e3f332..d43274b028604364a37ca485f41bd5580d1734df 100644 (file)
@@ -269,7 +269,7 @@ pub fn request_and_load_media(
         if let Ok(Some(media_id)) = handle.read_label() {
             worker.log(format!(
                 "found media label {} ({})",
-                media_id.label.changer_id,
+                media_id.label.label_text,
                 media_id.label.uuid.to_string(),
             ));
             if media_id.label.uuid == *uuid {
@@ -285,9 +285,9 @@ pub fn request_and_load_media(
                 "virtual" => {
                     let mut tape = VirtualTapeDrive::deserialize(config)?;
 
-                    let changer_id = label.changer_id.clone();
+                    let label_text = label.label_text.clone();
 
-                    tape.load_media(&changer_id)?;
+                    tape.load_media(&label_text)?;
 
                     let mut handle: Box<dyn TapeDriver> = Box::new(tape.open()?);
 
@@ -298,12 +298,12 @@ pub fn request_and_load_media(
                 "linux" => {
                     let drive_config = LinuxTapeDrive::deserialize(config)?;
 
-                    let changer_id = label.changer_id.clone();
+                    let label_text = label.label_text.clone();
 
                     if drive_config.changer.is_some() {
 
                         let mut changer = MtxMediaChanger::with_drive_config(&drive_config)?;
-                        changer.load_media(&changer_id)?;
+                        changer.load_media(&label_text)?;
 
                         let mut handle: Box<dyn TapeDriver> = Box::new(drive_config.open()?);
 
@@ -312,11 +312,11 @@ pub fn request_and_load_media(
                         return Ok((handle, media_id));
                     }
 
-                    worker.log(format!("Please insert media '{}' into drive '{}'", changer_id, drive));
+                    worker.log(format!("Please insert media '{}' into drive '{}'", label_text, drive));
 
                     let to = "root@localhost"; // fixme
 
-                    send_load_media_email(drive, &changer_id, to)?;
+                    send_load_media_email(drive, &label_text, to)?;
 
                     let mut last_media_uuid = None;
                     let mut last_error = None;
@@ -340,7 +340,7 @@ pub fn request_and_load_media(
                                 if media_id.label.uuid == label.uuid {
                                     worker.log(format!(
                                         "found media label {} ({})",
-                                        media_id.label.changer_id,
+                                        media_id.label.label_text,
                                         media_id.label.uuid.to_string(),
                                     ));
                                     return Ok((Box::new(handle), media_id));
@@ -348,7 +348,7 @@ pub fn request_and_load_media(
                                     if Some(media_id.label.uuid.clone()) != last_media_uuid {
                                         worker.log(format!(
                                             "wrong media label {} ({})",
-                                            media_id.label.changer_id,
+                                            media_id.label.label_text,
                                             media_id.label.uuid.to_string(),
                                         ));
                                         last_media_uuid = Some(media_id.label.uuid);
index 750fcd3c6cb3e310ad1108c28a29a09e3417aa32..f578b298030f6dbb9648e557d7fbbb50c52b2405 100644 (file)
@@ -157,7 +157,7 @@ impl VirtualTapeHandle {
         Ok(())
     }
 
-    fn online_media_changer_ids(&self) -> Result<Vec<String>, Error> {
+    fn online_media_label_texts(&self) -> Result<Vec<String>, Error> {
         let mut list = Vec::new();
         for entry in std::fs::read_dir(&self.path)? {
             let entry = entry?;
@@ -389,12 +389,12 @@ impl MediaChange for VirtualTapeHandle {
         // slot-assignment here.
 
         let mut slots = Vec::new();
-        let changer_ids = self.online_media_changer_ids()?;
-        let max_slots = ((changer_ids.len() + 7)/8) * 8;
+        let label_texts = self.online_media_label_texts()?;
+        let max_slots = ((label_texts.len() + 7)/8) * 8;
 
         for i in 0..max_slots {
-            if let Some(changer_id) = changer_ids.get(i) {
-                slots.push((false,  ElementStatus::VolumeTag(changer_id.clone())));
+            if let Some(label_text) = label_texts.get(i) {
+                slots.push((false,  ElementStatus::VolumeTag(label_text.clone())));
             } else {
                 slots.push((false,  ElementStatus::Empty));
             }
@@ -407,7 +407,7 @@ impl MediaChange for VirtualTapeHandle {
         bail!("media tranfer is not implemented!");
     }
 
-    fn export_media(&mut self, _changer_id: &str) -> Result<Option<u64>, Error> {
+    fn export_media(&mut self, _label_text: &str) -> Result<Option<u64>, Error> {
         bail!("media export is not implemented!");
     }
 
@@ -416,13 +416,13 @@ impl MediaChange for VirtualTapeHandle {
             bail!("invalid slot ID {}", slot);
         }
 
-        let changer_ids = self.online_media_changer_ids()?;
+        let label_texts = self.online_media_label_texts()?;
 
-        if slot > changer_ids.len() as u64 {
+        if slot > label_texts.len() as u64 {
             bail!("slot {} is empty", slot);
         }
 
-        self.load_media(&changer_ids[slot as usize - 1])
+        self.load_media(&label_texts[slot as usize - 1])
     }
 
     /// Try to load media
@@ -479,9 +479,9 @@ impl MediaChange for VirtualTapeDrive {
         handle.transfer_media(from, to)
     }
 
-    fn export_media(&mut self, changer_id: &str) -> Result<Option<u64>, Error> {
+    fn export_media(&mut self, label_text: &str) -> Result<Option<u64>, Error> {
         let mut handle = self.open()?;
-        handle.export_media(changer_id)
+        handle.export_media(label_text)
     }
 
     fn load_media_from_slot(&mut self, slot: u64) -> Result<(), Error> {
@@ -489,9 +489,9 @@ impl MediaChange for VirtualTapeDrive {
         handle.load_media_from_slot(slot)
     }
 
-    fn load_media(&mut self, changer_id: &str) -> Result<(), Error> {
+    fn load_media(&mut self, label_text: &str) -> Result<(), Error> {
         let mut handle = self.open()?;
-        handle.load_media(changer_id)
+        handle.load_media(label_text)
     }
 
     fn unload_media(&mut self, target_slot: Option<u64>) -> Result<(), Error> {
@@ -500,9 +500,9 @@ impl MediaChange for VirtualTapeDrive {
         Ok(())
     }
 
-    fn online_media_changer_ids(&mut self) -> Result<Vec<String>, Error> {
+    fn online_media_label_texts(&mut self) -> Result<Vec<String>, Error> {
         let handle = self.open()?;
-        handle.online_media_changer_ids()
+        handle.online_media_label_texts()
     }
 
     fn clean_drive(&mut self) -> Result<(), Error> {
index aff73e8f104afd1cecb18ff9af77e87b94238e38..38a86dab108a955b47fca58063dd7637da532af3 100644 (file)
@@ -164,8 +164,8 @@ pub struct ChunkArchiveEntryHeader {
 pub struct MediaLabel {
     /// Unique ID
     pub uuid: Uuid,
-    /// Media Changer ID or Barcode
-    pub changer_id: String,
+    /// Media label text (or Barcode)
+    pub label_text: String,
     /// Creation time stamp
     pub ctime: i64,
 }
index e86cd66a4a4619b01a7eb33ec0b3db63f3a19d47..fce27f83e85f19fa52dce0de315eabfa2c23b7a1 100644 (file)
@@ -213,10 +213,10 @@ impl Inventory {
         self.map.get(uuid).map(|entry| &entry.id)
     }
 
-    /// find media by changer_id
-    pub fn find_media_by_changer_id(&self, changer_id: &str) -> Option<&MediaId> {
+    /// find media by label_text
+    pub fn find_media_by_label_text(&self, label_text: &str) -> Option<&MediaId> {
         for (_uuid, entry) in &self.map {
-            if entry.id.label.changer_id == changer_id {
+            if entry.id.label.label_text == label_text {
                 return Some(&entry.id);
             }
         }
@@ -534,10 +534,10 @@ impl Inventory {
     // Helpers to simplify testing
 
     /// Genreate and insert a new free tape (test helper)
-    pub fn generate_free_tape(&mut self, changer_id: &str, ctime: i64) -> Uuid {
+    pub fn generate_free_tape(&mut self, label_text: &str, ctime: i64) -> Uuid {
 
         let label = MediaLabel {
-            changer_id: changer_id.to_string(),
+            label_text: label_text.to_string(),
             uuid: Uuid::generate(),
             ctime,
         };
@@ -552,13 +552,13 @@ impl Inventory {
     /// (test helper)
     pub fn generate_assigned_tape(
         &mut self,
-        changer_id: &str,
+        label_text: &str,
         pool: &str,
         ctime: i64,
     ) -> Uuid {
 
         let label = MediaLabel {
-            changer_id: changer_id.to_string(),
+            label_text: label_text.to_string(),
             uuid: Uuid::generate(),
             ctime,
         };
@@ -575,12 +575,12 @@ impl Inventory {
     /// Genreate and insert a used tape (test helper)
     pub fn generate_used_tape(
         &mut self,
-        changer_id: &str,
+        label_text: &str,
         set: MediaSetLabel,
         ctime: i64,
     ) -> Uuid {
         let label = MediaLabel {
-            changer_id: changer_id.to_string(),
+            label_text: label_text.to_string(),
             uuid: Uuid::generate(),
             ctime,
         };
@@ -735,7 +735,7 @@ pub fn complete_media_set_uuid(
 }
 
 /// List of known media labels (barcodes)
-pub fn complete_media_changer_id(
+pub fn complete_media_label_text(
     _arg: &str,
     _param: &HashMap<String, String>,
 ) -> Vec<String> {
@@ -745,5 +745,5 @@ pub fn complete_media_changer_id(
         Err(_) => return Vec::new(),
     };
 
-    inventory.map.values().map(|entry| entry.id.label.changer_id.clone()).collect()
+    inventory.map.values().map(|entry| entry.id.label.label_text.clone()).collect()
 }
index 80760edb02c1ffa545dae2713f21dc29957f1e50..b44f5cab6b28ac74bc46fc15c84eb089a3e8e803 100644 (file)
@@ -317,7 +317,7 @@ impl MediaPool {
                 }
             }
             if self.media_is_expired(&media, current_time) {
-                println!("found expired media on media '{}'", media.changer_id());
+                println!("found expired media on media '{}'", media.label_text());
                 expired_media.push(media);
             }
         }
@@ -335,7 +335,7 @@ impl MediaPool {
                 bail!("alloc writable media in pool '{}' failed: no usable media found", self.name());
             }
             Some(media) => {
-                println!("reuse expired media '{}'", media.changer_id());
+                println!("reuse expired media '{}'", media.label_text());
 
                 let seq_nr = self.current_media_set.media_list().len() as u64;
                 let set = MediaSetLabel::with_data(&pool, self.current_media_set.uuid().clone(), seq_nr, current_time);
@@ -494,7 +494,7 @@ impl BackupMedia {
     }
 
     /// Returns the media label (Barcode)
-    pub fn changer_id(&self) -> &str {
-        &self.id.label.changer_id
+    pub fn label_text(&self) -> &str {
+        &self.id.label.label_text
     }
 }
index 79b1d2bd1465a8fc2091a1e09cb25a13021bc90c..e010fbcf1c313e801f7c7d1d8abddfc0f340c1ea 100644 (file)
@@ -99,8 +99,8 @@ pub fn mtx_status_to_online_set(status: &MtxStatus, inventory: &Inventory) -> Ha
     let mut online_set = HashSet::new();
 
     for drive_status in status.drives.iter() {
-        if let ElementStatus::VolumeTag(ref changer_id) = drive_status.status {
-            if let Some(media_id) = inventory.find_media_by_changer_id(changer_id) {
+        if let ElementStatus::VolumeTag(ref label_text) = drive_status.status {
+            if let Some(media_id) = inventory.find_media_by_label_text(label_text) {
                 online_set.insert(media_id.label.uuid.clone());
             }
         }
@@ -108,8 +108,8 @@ pub fn mtx_status_to_online_set(status: &MtxStatus, inventory: &Inventory) -> Ha
 
     for (import_export, slot_status) in status.slots.iter() {
         if *import_export { continue; }
-        if let ElementStatus::VolumeTag(ref changer_id) = slot_status {
-            if let Some(media_id) = inventory.find_media_by_changer_id(changer_id) {
+        if let ElementStatus::VolumeTag(ref label_text) = slot_status {
+            if let Some(media_id) = inventory.find_media_by_label_text(label_text) {
                 online_set.insert(media_id.label.uuid.clone());
             }
         }
@@ -146,7 +146,7 @@ pub fn update_online_status(state_path: &Path) -> Result<OnlineStatusMap, Error>
 
     let vtapes: Vec<VirtualTapeDrive> = config.convert_to_typed_array("virtual")?;
     for mut vtape in vtapes {
-        let media_list = match vtape.online_media_changer_ids() {
+        let media_list = match vtape.online_media_label_texts() {
             Ok(media_list) => media_list,
             Err(err) => {
                 eprintln!("unable to get changer '{}' status - {}", vtape.name, err);
@@ -155,8 +155,8 @@ pub fn update_online_status(state_path: &Path) -> Result<OnlineStatusMap, Error>
         };
 
         let mut online_set = HashSet::new();
-        for changer_id in media_list {
-            if let Some(media_id) = inventory.find_media_by_changer_id(&changer_id) {
+        for label_text in media_list {
+            if let Some(media_id) = inventory.find_media_by_label_text(&label_text) {
                 online_set.insert(media_id.label.uuid.clone());
             }
         }
@@ -173,13 +173,13 @@ pub fn update_changer_online_status(
     drive_config: &SectionConfigData,
     inventory: &mut Inventory,
     changer_name: &str,
-    changer_id_list: &Vec<String>,
+    label_text_list: &Vec<String>,
 ) -> Result<(), Error> {
 
     let mut online_map = OnlineStatusMap::new(drive_config)?;
     let mut online_set = HashSet::new();
-    for changer_id in changer_id_list.iter() {
-        if let Some(media_id) = inventory.find_media_by_changer_id(&changer_id) {
+    for label_text in label_text_list.iter() {
+        if let Some(media_id) = inventory.find_media_by_label_text(&label_text) {
             online_set.insert(media_id.label.uuid.clone());
         }
     }
index e3bd4f6f2715bfc0fdde0016b4593af3e4872c37..b3ee9c236732c4732e3a9ca510d1d8664de14efb 100644 (file)
@@ -150,11 +150,11 @@ impl PoolWriter {
 
             for media_uuid in self.pool.current_media_list()? {
                 let media = self.pool.lookup_media(media_uuid)?;
-                let changer_id = media.changer_id();
-                if let Some(slot) = changer.export_media(changer_id)? {
-                    worker.log(format!("exported media '{}' to import/export slot {}", changer_id, slot));
+                let label_text = media.label_text();
+                if let Some(slot) = changer.export_media(label_text)? {
+                    worker.log(format!("exported media '{}' to import/export slot {}", label_text, slot));
                 } else {
-                    worker.warn(format!("export failed - media '{}' is not online", changer_id));
+                    worker.warn(format!("export failed - media '{}' is not online", label_text));
                 }
             }