has
'auth'
=> (
is
=>
'ro'
,
required
=> 1);
has
'name'
=> (
is
=>
'ro'
,
required
=> 1);
has
'region'
=> (
is
=>
'ro'
,
required
=> 1);
has
'interface'
=> (
is
=>
'ro'
,
default
=>
'public'
);
has
'client'
=> (
is
=>
'ro'
,
lazy
=> 1,
default
=>
sub
{
my
(
$self
) =
@_
;
return
$self
->auth->service(
$self
->name,
region
=>
$self
->region,
interface
=>
$self
->interface);
},
handles
=> [
qw/endpoint get put post delete/
]
);
has
'api'
=> (
is
=>
'ro'
,
required
=> 1)
;
has
'api_specs'
=> (
is
=>
'ro'
,
lazy
=> 1,
default
=> \
&BUILD_api_specs
);
has
'version'
=> (
'is'
=>
'ro'
,
lazy
=> 1,
default
=> \
&BUILD_version
);
has
'version_prefix'
=> (
'is'
=>
'ro'
);
has
'methods'
=> (
is
=>
'ro'
,
default
=>
sub
{
return
{} });
sub
BUILD {
my
(
$self
,
$args
) =
@_
;
$self
->api_specs->setup_api_methods_for_service(
$self
);
return
;
}
sub
BUILD_version {
my
(
$self
) =
@_
;
my
$url
=
$self
->client->endpoint;
if
(
$url
=~ m{/(v[0-9\.]+)}) {
return
$1;
}
return
'default'
;
}
sub
BUILD_api_specs {
my
(
$self
) =
@_
;
my
$v
=
$self
->version;
$v
=~ s{\.}{_};
my
$pkg
=
'OpenStack::MetaAPI::API::Specs::'
.
ucfirst
(
$self
->name) .
'::'
.
$v
;
my
$load
=
eval
qq{ require $pkg; 1 }
;
if
(
$load
) {
return
$pkg
->new();
}
return
OpenStack::MetaAPI::API::Specs::Default->new();
}
sub
root_uri {
my
(
$self
,
$uri
) =
@_
;
return
unless
defined
$uri
;
return
$uri
if
$uri
=~ m{^v};
return
if
$self
->endpoint &&
$self
->endpoint =~ m{:[\d]/v}a;
if
(
$self
->version_prefix) {
my
$base
=
$self
->version_prefix;
$base
.=
'/'
unless
$uri
=~ m{^/};
$base
.=
$uri
;
return
$base
;
}
return
$uri
;
}
sub
setup_method {
my
(
$self
,
$name
,
$sub
) =
@_
;
die
unless
ref
$self
;
die
"missing name"
unless
$name
;
die
unless
ref
$sub
eq
'CODE'
;
my
$methods
=
$self
->methods();
die
"Method '$name' already exists"
if
defined
$methods
->{
$name
};
die
"Function '$name' already exists for "
.
ref
(
$self
)
if
$self
->can(
$name
);
$methods
->{
$name
} =
$sub
;
return
1;
}
sub
can_method {
my
(
$self
,
$method
) =
@_
;
my
$sub
=
$self
->can(
$method
);
if
(not
defined
$sub
&&
ref
$self
) {
$sub
=
$self
->methods()->{
$method
};
}
return
$sub
;
}
1;