Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
noc
tower
Commits
eb5d7ab0
Commit
eb5d7ab0
authored
Oct 27, 2020
by
EKbfh
🐼
Browse files
Merge branch 'patch-avs-add-joblog' into 'master'
Add joblog command. See merge request
!64
parents
68b07c09
a2004a54
Pipeline
#27851
passed with stages
in 2 minutes and 40 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
setup.py
View file @
eb5d7ab0
...
...
@@ -68,7 +68,8 @@ def main():
"tower-pull = tower.cli.pull:main"
,
"tower-web = tower.daemons.web:run"
,
"tower-dump = tower.cli.backup:dump"
,
"tower-restore = tower.cli.backup:restore"
"tower-restore = tower.cli.backup:restore"
,
"tower-joblog = tower.cli.joblog:main"
,
]
},
package_data
=
{
...
...
tower/cli/inv.py
View file @
eb5d7ab0
...
...
@@ -10,32 +10,29 @@
import
os
import
sys
import
json
from
opt
parse
import
Option
Parser
from
arg
parse
import
Argument
Parser
# Tower modules
os
.
chdir
(
os
.
path
.
join
(
os
.
path
.
dirname
(
sys
.
argv
[
0
]),
".."
)
)
os
.
chdir
(
os
.
path
.
join
(
os
.
path
.
dirname
(
sys
.
argv
[
0
]),
".."
))
from
tower.models.environment
import
Environment
# noqa
def
main
():
parser
=
Option
Parser
()
parser
.
add_
option
(
parser
=
Argument
Parser
()
parser
.
add_
argument
(
"--env"
,
action
=
"store"
,
dest
=
"env"
,
action
=
"store"
,
dest
=
"env"
,
help
=
"Use environment [%default]"
,
default
=
get_default_env
()
default
=
get_default_env
()
,
)
# Ansible dynamic inventory interface
parser
.
add_option
(
"--list"
,
action
=
"store_const"
,
dest
=
"cmd"
,
const
=
"list"
,
help
=
"Ansible inventory"
parser
.
add_argument
(
"--list"
,
action
=
"store_const"
,
dest
=
"cmd"
,
const
=
"list"
,
help
=
"Ansible inventory"
)
options
,
args
=
parser
.
parse_args
()
if
option
s
.
cmd
==
"list"
:
ansible_list
(
options
,
args
)
args
=
parser
.
parse_args
()
if
arg
s
.
cmd
==
"list"
:
ansible_list
(
args
)
def
get_default_env
():
...
...
@@ -51,13 +48,13 @@ def die(msg):
sys
.
exit
(
1
)
def
ansible_list
(
options
,
args
):
def
ansible_list
(
args
):
"""
Ansible dynamic inventory
:return:
"""
try
:
env
=
Environment
.
get
(
Environment
.
name
==
option
s
.
env
)
env
=
Environment
.
get
(
Environment
.
name
==
arg
s
.
env
)
print
(
json
.
dumps
(
env
.
ansible_inventory
,
sort_keys
=
True
,
indent
=
2
))
except
Environment
.
DoesNotExist
:
die
(
"Invalid environment: '%s'"
%
option
s
.
env
)
die
(
"Invalid environment: '%s'"
%
arg
s
.
env
)
tower/cli/joblog.py
0 → 100644
View file @
eb5d7ab0
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------
# Deploy log
# -----------------------------------------------------------------------
# Copyright (C) 2015 The NOC Project
# See LICENSE for details
# -----------------------------------------------------------------------
# Python modules
import
os
import
sys
import
datetime
import
time
from
argparse
import
ArgumentParser
# Tower modules
os
.
chdir
(
os
.
path
.
join
(
os
.
path
.
dirname
(
sys
.
argv
[
0
]),
".."
))
from
tower.models.environment
import
Environment
# noqa
from
tower.models.joblog
import
JobLog
# noqa
def
main
():
parser
=
ArgumentParser
()
parser
.
add_argument
(
"--env"
,
action
=
"store"
,
dest
=
"env"
,
help
=
"Use environment [%%default]"
,
default
=
get_default_env
(),
)
subparsers
=
parser
.
add_subparsers
(
dest
=
"cmd"
)
# Ansible dynamic inventory interface
subparsers
.
add_parser
(
"list"
,
# action="store_const", dest="cmd", const="list",
help
=
"List available logs"
,
)
view
=
subparsers
.
add_parser
(
"view"
,
# action="store_const", dest="cmd", const="list",
help
=
"Show log by start time"
,
)
view
.
add_argument
(
"--start"
,
help
=
""
,
required
=
True
)
clean
=
subparsers
.
add_parser
(
"clean"
,
# action="store_const", dest="cmd", const="list",
help
=
"Clean logs before start"
,
)
clean
.
add_argument
(
"--before"
,
help
=
"DateTime before log will be deleted"
,
required
=
False
)
clean
.
add_argument
(
"--save-last"
,
type
=
int
,
help
=
"Cleanup joblog to last N record"
,
required
=
False
,
default
=
10
)
args
=
parser
.
parse_args
()
if
args
.
cmd
==
"list"
:
joblog_list
(
args
)
elif
args
.
cmd
==
"view"
:
joblog_view
(
args
)
elif
args
.
cmd
==
"clean"
:
joblog_clean
(
args
)
def
get_default_env
():
if
os
.
environ
.
get
(
"NOC_ENV"
):
env
=
os
.
environ
.
get
(
"NOC_ENV"
)
else
:
env
=
Environment
.
get
(
is_default
=
1
).
name
return
env
def
die
(
msg
):
print
(
msg
+
"
\n
"
)
sys
.
exit
(
1
)
def
print_stat
(
joblog
):
print
(
"Start: %s ; Completed: %s"
%
(
joblog
.
start_ts
,
joblog
.
complete_ts
))
print
(
"OK: %d; Changed: %d; Unreachable: %d; Failed: %d"
%
(
joblog
.
n_ok
,
joblog
.
n_changed
,
joblog
.
n_unreachable
,
joblog
.
n_failed
)
)
print
(
"
\n
"
)
def
joblog_list
(
args
):
"""
Ansible dynamic inventory
:return:
"""
try
:
env
=
Environment
.
get
(
Environment
.
name
==
args
.
env
)
# print(json.dumps(env.ansible_inventory, sort_keys=True, indent=2))
except
Environment
.
DoesNotExist
:
die
(
"Invalid environment: '%s'"
%
args
.
env
)
print
(
"="
*
20
,
env
.
name
,
"="
*
20
)
print
(
""
)
for
log
in
JobLog
.
filter
(
environment
=
env
).
order_by
((
"start_ts"
,
"DESC"
)):
print_stat
(
log
)
def
joblog_view
(
args
):
try
:
joblog
=
JobLog
.
get
(
start_ts
=
args
.
start
)
print
(
joblog
.
log
)
print_stat
(
joblog
)
except
JobLog
.
DoesNotExist
:
die
(
"Invalid Joblog Start Ts: '%s'"
%
args
.
env
)
def
joblog_clean
(
args
):
joblog_count
=
JobLog
.
filter
(
is_complete
=
True
).
count
()
if
args
.
before
:
before
=
datetime
.
datetime
.
strptime
(
args
.
before
,
"%Y-%m-%d %H:%M"
)
cleaned_job
=
JobLog
.
filter
(
start_ts__gte
=
before
,
is_complete
=
True
)
print
(
" %d JobLog before %s will be cleaned"
%
(
cleaned_job
.
count
(),
args
.
before
))
elif
args
.
save_last
and
joblog_count
>
args
.
save_last
:
cleaned_job
=
(
JobLog
.
filter
(
is_complete
=
True
)
.
order_by
(
JobLog
.
start_ts
)
.
limit
(
joblog_count
-
args
.
save_last
)
)
print
(
" %d/%d JobLog more %s will be cleaned"
%
(
cleaned_job
.
count
(),
joblog_count
,
args
.
save_last
)
)
elif
args
.
save_last
and
joblog_count
<=
args
.
save_last
:
die
(
"JobLog count is %d less (or equal) that save param: %d"
%
(
joblog_count
,
args
.
save_last
)
)
else
:
die
(
"Please set cleanup policy"
)
print
(
" %d JobLog will be Remove..
\n
"
%
cleaned_job
.
count
())
for
i
in
reversed
(
range
(
1
,
10
)):
print
(
"%d
\n
"
%
i
)
time
.
sleep
(
1
)
for
x
,
job
in
enumerate
(
cleaned_job
):
print
(
x
,
job
)
job
.
delete_instance
()
if
__name__
==
"__main__"
:
main
()
tower/cli/pull.py
View file @
eb5d7ab0
...
...
@@ -11,39 +11,36 @@ import datetime
import
logging
import
os
import
sys
from
opt
parse
import
Option
Parser
from
arg
parse
import
Argument
Parser
from
tower.api.pull
import
PullAPI
# Tower modules
from
tower.models.db
import
db
from
tower.models.pulllog
import
PullLog
os
.
chdir
(
os
.
path
.
join
(
os
.
path
.
dirname
(
sys
.
argv
[
0
]),
".."
)
)
os
.
chdir
(
os
.
path
.
join
(
os
.
path
.
dirname
(
sys
.
argv
[
0
]),
".."
))
from
tower.models.environment
import
Environment
# noqa
def
main
():
logging
.
basicConfig
(
level
=
logging
.
DEBUG
)
parser
=
Option
Parser
()
parser
.
add_
option
(
parser
=
Argument
Parser
()
parser
.
add_
argument
(
"--env"
,
action
=
"store"
,
dest
=
"env"
,
action
=
"store"
,
dest
=
"env"
,
help
=
"Use environment [%default]"
,
default
=
os
.
environ
.
get
(
"NOC_ENV"
,
"test"
)
default
=
os
.
environ
.
get
(
"NOC_ENV"
,
"test"
)
,
)
options
,
args
=
parser
.
parse_args
()
args
=
parser
.
parse_args
()
try
:
env
=
Environment
.
get
(
Environment
.
name
==
option
s
.
env
)
env
=
Environment
.
get
(
Environment
.
name
==
arg
s
.
env
)
except
Environment
.
DoesNotExist
:
die
(
"Invalid environment: '%s'"
%
option
s
.
env
)
die
(
"Invalid environment: '%s'"
%
arg
s
.
env
)
with
db
.
atomic
():
job
=
PullLog
(
start_ts
=
datetime
.
datetime
.
now
(),
environment
=
env
,
user
=
"cli"
,
repo
=
env
.
playbook_link
start_ts
=
datetime
.
datetime
.
now
(),
environment
=
env
,
user
=
"cli"
,
repo
=
env
.
playbook_link
)
job
.
save
()
api
=
PullAPI
(
None
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment