diff options
| author | Diana Corbacho <diana@rabbitmq.com> | 2019-08-14 13:24:05 +0100 |
|---|---|---|
| committer | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2019-08-30 10:31:11 +0200 |
| commit | dbe1b022685cf404fc90710803360c7db42a435e (patch) | |
| tree | e03981513a6a05e0f6886922750f09e9a89bc63e /src/vhost.erl | |
| parent | 501334a29225336080100df83f34623214337b4f (diff) | |
| download | rabbitmq-server-git-dbe1b022685cf404fc90710803360c7db42a435e.tar.gz | |
Make virtual host record versioned
Add metadata fields to virtual host
Address feedback in #2080
* Switch to functions for vhost record accessors
* Restore rabbit_vhost:list/0 behavior, introduce rabbit_vhost:all/0
to compensate
* Store tags as an array of atoms, the same way we do for user tags
* Type spec fixes
* Other minor interface improvements suggested by @dumbbell
Co-Authored-By: Michael Klishin <mklishin@pivotal.io>
[#166298298]
Diffstat (limited to 'src/vhost.erl')
| -rw-r--r-- | src/vhost.erl | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/vhost.erl b/src/vhost.erl new file mode 100644 index 0000000000..7bcb6d18e5 --- /dev/null +++ b/src/vhost.erl @@ -0,0 +1,181 @@ +%% The contents of this file are subject to the Mozilla Public License +%% Version 1.1 (the "License"); you may not use this file except in +%% compliance with the License. You may obtain a copy of the License +%% at https://www.mozilla.org/MPL/ +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and +%% limitations under the License. +%% +%% The Original Code is RabbitMQ. +%% +%% The Initial Developer of the Original Code is GoPivotal, Inc. +%% Copyright (c) 2018-2019 Pivotal Software, Inc. All rights reserved. +%% + +-module(vhost). + +-include_lib("rabbit_common/include/rabbit.hrl"). +-include("vhost.hrl"). + +-export([ + new/2, + new/3, + fields/0, + fields/1, + info_keys/0, + record_version_to_use/0, + upgrade/1, + upgrade_to/2, + pattern_match_all/0, + get_name/1, + get_limits/1, + get_metadata/1, + get_description/1, + get_tags/1, + set_limits/2 +]). + +-define(record_version, vhost_v2). + +-type(name() :: binary()). + +-type(metadata_key() :: atom()). + +-type(metadata() :: #{description => binary(), + tags => [atom()], + metadata_key() => any()} | undefined). + +-type vhost() :: vhost_v1:vhost_v1() | vhost_v2(). + +-record(vhost, { + %% name as a binary + virtual_host :: name() | '_', + %% proplist of limits configured, if any + limits :: list() | '_', + metadata :: metadata() | '_' +}). + +-type vhost_v2() :: #vhost{ + virtual_host :: name(), + limits :: list(), + metadata :: metadata() + }. + +-type vhost_pattern() :: vhost_v1:vhost_v1_pattern() | + vhost_v2_pattern(). +-type vhost_v2_pattern() :: #vhost{ + virtual_host :: name() | '_', + limits :: '_', + metadata :: '_' + }. + +-export_type([name/0, + metadata_key/0, + metadata/0, + vhost/0, + vhost_v2/0, + vhost_pattern/0, + vhost_v2_pattern/0]). + +-spec new(name(), list()) -> vhost(). +new(Name, Limits) -> + case record_version_to_use() of + ?record_version -> + #vhost{virtual_host = Name, limits = Limits}; + _ -> + vhost_v1:new(Name, Limits) + end. + +-spec new(rabbit_vhost:name(), list(), map()) -> vhost(). +new(Name, Limits, Metadata) -> + case record_version_to_use() of + ?record_version -> + #vhost{virtual_host = Name, limits = Limits, metadata = Metadata}; + _ -> + vhost_v1:new(Name, Limits) + end. + +-spec record_version_to_use() -> vhost_v1 | vhost_v2. + +record_version_to_use() -> + case rabbit_feature_flags:is_enabled(virtual_host_metadata) of + true -> ?record_version; + false -> vhost_v1:record_version_to_use() + end. + +-spec upgrade(vhost()) -> vhost(). + +upgrade(#vhost{} = VHost) -> VHost; +upgrade(OldVHost) -> upgrade_to(record_version_to_use(), OldVHost). + +-spec upgrade_to +(vhost_v2, vhost()) -> vhost_v2(); +(vhost_v1, vhost_v1:vhost_v1()) -> vhost_v1:vhost_v1(). + +upgrade_to(?record_version, #vhost{} = VHost) -> + VHost; +upgrade_to(?record_version, OldVHost) -> + Fields = erlang:tuple_to_list(OldVHost) ++ [#{}], + #vhost{} = erlang:list_to_tuple(Fields); +upgrade_to(Version, OldVHost) -> + vhost_v1:upgrade_to(Version, OldVHost). + + +fields() -> + case record_version_to_use() of + ?record_version -> fields(?record_version); + _ -> vhost_v1:fields() + end. + +fields(?record_version) -> record_info(fields, vhost); +fields(Version) -> vhost_v1:fields(Version). + +info_keys() -> + case record_version_to_use() of + %% note: this reports description and tags separately even though + %% they are stored in the metadata map. MK. + ?record_version -> [name, description, tags, metadata, tracing, cluster_state]; + _ -> vhost_v1:info_keys() + end. + +-spec pattern_match_all() -> vhost_pattern(). + +pattern_match_all() -> + case record_version_to_use() of + ?record_version -> #vhost{_ = '_'}; + _ -> vhost_v1:pattern_match_all() + end. + +-spec get_name(vhost()) -> name(). +get_name(#vhost{virtual_host = Value}) -> Value; +get_name(VHost) -> vhost_v1:get_name(VHost). + +-spec get_limits(vhost()) -> list(). +get_limits(#vhost{limits = Value}) -> Value; +get_limits(VHost) -> vhost_v1:get_limits(VHost). + +-spec get_metadata(vhost()) -> metadata(). +get_metadata(#vhost{metadata = Value}) -> Value; +get_metadata(VHost) -> vhost_v1:get_limits(VHost). + +-spec get_description(vhost()) -> binary(). +get_description(#vhost{} = VHost) -> + maps:get(description, get_metadata(VHost), undefined); +get_description(VHost) -> + vhost_v1:get_description(VHost). + +-spec get_tags(vhost()) -> [atom()]. +get_tags(#vhost{} = VHost) -> + maps:get(tags, get_metadata(VHost), undefined); +get_tags(VHost) -> + vhost_v1:get_tags(VHost). + +set_limits(VHost, Value) -> + case record_version_to_use() of + ?record_version -> + VHost#vhost{limits = Value}; + _ -> + vhost_v1:set_limits(VHost, Value) + end. |
