Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion openstack_tui/.config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ views:
status_field: status
fields:
- name: flavor
json_pointer: "/original_name"
json_pointer: "/flavor/original_name"
# dns
dns.recordset:
default_fields: [name, status, type, created, updated]
Expand Down
41 changes: 27 additions & 14 deletions openstack_tui/src/components/compute/aggregates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,11 @@
//
// SPDX-License-Identifier: Apache-2.0

use crate::cloud_worker::compute::v2::{
ComputeAggregateApiRequest, ComputeAggregateList, ComputeApiRequest,
};
use crate::action::Action;
use crate::cloud_worker::compute::v2::ComputeAggregateList;
use crate::cloud_worker::types::ApiRequest;
use crate::components::generic_resource_view::GenericResourceView;
use crate::components::resource_behaviour::ResourceBehaviour;
use crate::components::resource_behaviour::{GeneratedResourceBehaviour, ResourceBehaviour};
use crate::mode::Mode;

/// Behaviour implementation for ComputeAggregates.
Expand All @@ -27,23 +26,22 @@ impl ResourceBehaviour for ComputeAggregatesBehaviour {
type Filter = ComputeAggregateList;

fn view_key() -> &'static str {
"compute.aggregate"
super::generated::aggregate::Generated::view_key()
}
fn title() -> &'static str {
"Compute Aggregates"
super::generated::aggregate::Generated::title()
}
fn mode() -> Mode {
Mode::Resource(Self::view_key())
super::generated::aggregate::Generated::mode()
}
fn request_from_filter(filter: &Self::Filter) -> ApiRequest {
ApiRequest::from(ComputeAggregateApiRequest::List(Box::new(filter.clone())))
super::generated::aggregate::Generated::request_from_filter(filter)
}
fn matches_request(request: &ApiRequest) -> bool {
matches!(
request,
ApiRequest::Compute(ComputeApiRequest::Aggregate(boxreq))
if matches!(**boxreq, ComputeAggregateApiRequest::List(_))
)
super::generated::aggregate::Generated::matches_request(request)
}
fn handle_set_filter_action(action: &Action) -> Option<Self::Filter> {
super::generated::aggregate::Generated::handle_set_filter_action(action)
}
}

Expand All @@ -53,12 +51,13 @@ pub type ComputeAggregates = GenericResourceView<'static, ComputeAggregatesBehav
#[cfg(test)]
mod tests {
use super::*;
use crate::cloud_worker::compute::v2::{ComputeAggregateApiRequest, ComputeApiRequest};
use crate::components::resource_behaviour::ResourceBehaviour;

#[test]
fn view_key_and_title() {
assert_eq!(ComputeAggregatesBehaviour::view_key(), "compute.aggregate");
assert_eq!(ComputeAggregatesBehaviour::title(), "Compute Aggregates");
assert_eq!(ComputeAggregatesBehaviour::title(), "Aggregates");
assert_eq!(
ComputeAggregatesBehaviour::mode(),
Mode::Resource(crate::mode::COMPUTE_AGGREGATE)
Expand Down Expand Up @@ -90,4 +89,18 @@ mod tests {
)));
assert!(!ComputeAggregatesBehaviour::matches_request(&req));
}

#[test]
fn handle_set_filter_action_returns_filter() {
let filter = ComputeAggregateList::default();
let action = Action::SetComputeAggregateListFilters(filter);
let result = ComputeAggregatesBehaviour::handle_set_filter_action(&action);
assert!(result.is_some());
}

#[test]
fn handle_set_filter_action_returns_none_for_unrelated() {
let result = ComputeAggregatesBehaviour::handle_set_filter_action(&Action::Tick);
assert!(result.is_none());
}
}
49 changes: 29 additions & 20 deletions openstack_tui/src/components/compute/flavors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,33 +14,28 @@

use crate::{
action::Action,
cloud_worker::compute::v2::{
ComputeApiRequest, ComputeFlavorApiRequest, ComputeFlavorList, ComputeServerListBuilder,
},
cloud_worker::compute::v2::{ComputeFlavorList, ComputeServerListBuilder},
cloud_worker::types::ApiRequest,
components::generic_resource_view::GenericResourceView,
components::resource_behaviour::{Mutation, ResourceBehaviour},
components::resource_behaviour::{GeneratedResourceBehaviour, Mutation, ResourceBehaviour},
mode::Mode,
};

const TITLE: &str = "Compute Flavors";
const VIEW_CONFIG_KEY: &str = "compute.flavor";

pub struct ComputeFlavorsBehaviour;

impl ResourceBehaviour for ComputeFlavorsBehaviour {
type Filter = ComputeFlavorList;

fn view_key() -> &'static str {
VIEW_CONFIG_KEY
super::generated::flavor::Generated::view_key()
}

fn title() -> &'static str {
TITLE
super::generated::flavor::Generated::title()
}

fn mode() -> Mode {
Mode::Resource(Self::view_key())
super::generated::flavor::Generated::mode()
}

fn normalise_filter(filter: Self::Filter) -> Self::Filter {
Expand All @@ -53,17 +48,15 @@ impl ResourceBehaviour for ComputeFlavorsBehaviour {
}

fn request_from_filter(filter: &Self::Filter) -> ApiRequest {
ApiRequest::from(ComputeFlavorApiRequest::ListDetailed(Box::new(
filter.clone(),
)))
super::generated::flavor::Generated::request_from_filter(filter)
}

fn matches_request(request: &ApiRequest) -> bool {
matches!(
request,
ApiRequest::Compute(ComputeApiRequest::Flavor(inner))
if matches!(&**inner, ComputeFlavorApiRequest::ListDetailed(_))
)
super::generated::flavor::Generated::matches_request(request)
}

fn handle_set_filter_action(action: &Action) -> Option<Self::Filter> {
super::generated::flavor::Generated::handle_set_filter_action(action)
}

fn filter_carry_action(
Expand Down Expand Up @@ -104,7 +97,9 @@ pub type ComputeFlavors = GenericResourceView<'static, ComputeFlavorsBehaviour>;
#[cfg(test)]
mod tests {
use super::*;
use crate::cloud_worker::compute::v2::ComputeServerApiRequest;
use crate::cloud_worker::compute::v2::{
ComputeApiRequest, ComputeFlavorApiRequest, ComputeServerApiRequest,
};
use crate::components::resource_behaviour::ResourceBehaviour;

fn make_flavor(id: &str) -> serde_json::Value {
Expand Down Expand Up @@ -142,7 +137,7 @@ mod tests {
#[test]
fn view_key_and_title() {
assert_eq!(ComputeFlavorsBehaviour::view_key(), "compute.flavor");
assert_eq!(ComputeFlavorsBehaviour::title(), "Compute Flavors");
assert_eq!(ComputeFlavorsBehaviour::title(), "Flavors");
assert_eq!(
ComputeFlavorsBehaviour::mode(),
Mode::Resource(crate::mode::COMPUTE_FLAVOR)
Expand Down Expand Up @@ -178,6 +173,20 @@ mod tests {
));
}

#[test]
fn handle_set_filter_action_returns_filter() {
let filter = ComputeFlavorList::default();
let action = Action::SetComputeFlavorListFilters(filter);
let result = ComputeFlavorsBehaviour::handle_set_filter_action(&action);
assert!(result.is_some());
}

#[test]
fn handle_set_filter_action_returns_none_for_unrelated() {
let result = ComputeFlavorsBehaviour::handle_set_filter_action(&Action::Tick);
assert!(result.is_none());
}

#[test]
fn filter_carry_action_show_servers_with_flavor() {
let flavor = make_flavor("flavor-123");
Expand Down
45 changes: 27 additions & 18 deletions openstack_tui/src/components/compute/hypervisors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,42 +12,36 @@
//
// SPDX-License-Identifier: Apache-2.0

use crate::cloud_worker::compute::v2::{
ComputeApiRequest, ComputeHypervisorApiRequest, ComputeHypervisorList,
};
use crate::action::Action;
use crate::cloud_worker::compute::v2::ComputeHypervisorList;
use crate::cloud_worker::types::ApiRequest;
use crate::components::generic_resource_view::GenericResourceView;
use crate::components::resource_behaviour::ResourceBehaviour;
use crate::components::resource_behaviour::{GeneratedResourceBehaviour, ResourceBehaviour};
use crate::mode::Mode;

const VIEW_CONFIG_KEY: &str = "compute.hypervisor";

/// Behaviour implementation for ComputeHypervisors.
pub struct ComputeHypervisorsBehaviour;

impl ResourceBehaviour for ComputeHypervisorsBehaviour {
type Filter = ComputeHypervisorList;

fn view_key() -> &'static str {
VIEW_CONFIG_KEY
super::generated::hypervisor::Generated::view_key()
}
fn title() -> &'static str {
"Compute Hypervisors"
super::generated::hypervisor::Generated::title()
}
fn mode() -> Mode {
Mode::Resource(Self::view_key())
super::generated::hypervisor::Generated::mode()
}
fn request_from_filter(filter: &Self::Filter) -> ApiRequest {
ApiRequest::from(ComputeHypervisorApiRequest::ListDetailed(Box::new(
filter.clone(),
)))
super::generated::hypervisor::Generated::request_from_filter(filter)
}
fn matches_request(request: &ApiRequest) -> bool {
matches!(
request,
ApiRequest::Compute(ComputeApiRequest::Hypervisor(boxreq))
if matches!(**boxreq, ComputeHypervisorApiRequest::ListDetailed(_))
)
super::generated::hypervisor::Generated::matches_request(request)
}
fn handle_set_filter_action(action: &Action) -> Option<Self::Filter> {
super::generated::hypervisor::Generated::handle_set_filter_action(action)
}
}

Expand All @@ -57,6 +51,7 @@ pub type ComputeHypervisors = GenericResourceView<'static, ComputeHypervisorsBeh
#[cfg(test)]
mod tests {
use super::*;
use crate::cloud_worker::compute::v2::{ComputeApiRequest, ComputeHypervisorApiRequest};
use crate::components::resource_behaviour::ResourceBehaviour;

#[test]
Expand All @@ -65,7 +60,7 @@ mod tests {
ComputeHypervisorsBehaviour::view_key(),
"compute.hypervisor"
);
assert_eq!(ComputeHypervisorsBehaviour::title(), "Compute Hypervisors");
assert_eq!(ComputeHypervisorsBehaviour::title(), "Hypervisors");
assert_eq!(
ComputeHypervisorsBehaviour::mode(),
Mode::Resource(crate::mode::COMPUTE_HYPERVISOR)
Expand Down Expand Up @@ -97,4 +92,18 @@ mod tests {
)));
assert!(!ComputeHypervisorsBehaviour::matches_request(&req));
}

#[test]
fn handle_set_filter_action_returns_filter() {
let filter = ComputeHypervisorList::default();
let action = Action::SetComputeHypervisorListFilters(filter);
let result = ComputeHypervisorsBehaviour::handle_set_filter_action(&action);
assert!(result.is_some());
}

#[test]
fn handle_set_filter_action_returns_none_for_unrelated() {
let result = ComputeHypervisorsBehaviour::handle_set_filter_action(&Action::Tick);
assert!(result.is_none());
}
}
30 changes: 10 additions & 20 deletions openstack_tui/src/components/compute/servers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,23 @@ use crate::cloud_worker::compute::v2::{
};
use crate::cloud_worker::types::{ApiRequest, ComputeApiRequest};
use crate::components::generic_resource_view::GenericResourceView;
use crate::components::resource_behaviour::ResourceBehaviour;
use crate::components::resource_behaviour::{GeneratedResourceBehaviour, ResourceBehaviour};
use crate::mode::Mode;

const VIEW_CONFIG_KEY: &str = "compute.server";

/// Behaviour implementation for ComputeServers.
pub struct ComputeServersBehaviour;

impl ResourceBehaviour for ComputeServersBehaviour {
type Filter = ComputeServerList;

fn view_key() -> &'static str {
VIEW_CONFIG_KEY
super::generated::server::Generated::view_key()
}
fn title() -> &'static str {
"Compute Servers"
super::generated::server::Generated::title()
}
fn mode() -> Mode {
Mode::Resource(Self::view_key())
super::generated::server::Generated::mode()
}
fn normalise_filter(mut filter: Self::Filter) -> Self::Filter {
if filter.sort_key.is_none() {
Expand All @@ -47,23 +45,15 @@ impl ResourceBehaviour for ComputeServersBehaviour {
filter
}
fn request_from_filter(filter: &Self::Filter) -> ApiRequest {
ApiRequest::Compute(ComputeApiRequest::Server(Box::new(
ComputeServerApiRequest::ListDetailed(Box::new(filter.clone())),
)))
// `Generated::Filter` is boxed (matches `Action::SetComputeServerListFilters`'s boxed
// payload); this behaviour's `Filter` stays unboxed, so adapt at the boundary.
super::generated::server::Generated::request_from_filter(&Box::new(filter.clone()))
}
fn matches_request(request: &ApiRequest) -> bool {
matches!(
request,
ApiRequest::Compute(ComputeApiRequest::Server(boxreq))
if matches!(**boxreq, ComputeServerApiRequest::ListDetailed(_))
)
super::generated::server::Generated::matches_request(request)
}
fn handle_set_filter_action(action: &Action) -> Option<Self::Filter> {
if let Action::SetComputeServerListFilters(f) = action {
Some((**f).clone())
} else {
None
}
super::generated::server::Generated::handle_set_filter_action(action).map(|f| *f)
}
fn confirm_request(
action: &Action,
Expand Down Expand Up @@ -223,7 +213,7 @@ mod tests {
#[test]
fn view_key_and_title() {
assert_eq!(ComputeServersBehaviour::view_key(), "compute.server");
assert_eq!(ComputeServersBehaviour::title(), "Compute Servers");
assert_eq!(ComputeServersBehaviour::title(), "Servers");
assert_eq!(
ComputeServersBehaviour::mode(),
Mode::Resource(crate::mode::COMPUTE_SERVER)
Expand Down
Loading
Loading