- Further fixes for license stuff
- Small fixes to ensure Quay works for Postgres
This commit is contained in:
parent
8866b881db
commit
d2880807b2
11 changed files with 16 additions and 73 deletions
|
@ -17,6 +17,8 @@ SCHEME_DRIVERS = {
|
||||||
'mysql': MySQLDatabase,
|
'mysql': MySQLDatabase,
|
||||||
'mysql+pymysql': MySQLDatabase,
|
'mysql+pymysql': MySQLDatabase,
|
||||||
'sqlite': SqliteDatabase,
|
'sqlite': SqliteDatabase,
|
||||||
|
'postgresql': PostgresqlDatabase,
|
||||||
|
'postgresql+psycopg2': PostgresqlDatabase,
|
||||||
}
|
}
|
||||||
|
|
||||||
db = Proxy()
|
db = Proxy()
|
||||||
|
@ -32,7 +34,7 @@ def _db_from_url(url, db_kwargs):
|
||||||
if parsed_url.username:
|
if parsed_url.username:
|
||||||
db_kwargs['user'] = parsed_url.username
|
db_kwargs['user'] = parsed_url.username
|
||||||
if parsed_url.password:
|
if parsed_url.password:
|
||||||
db_kwargs['passwd'] = parsed_url.password
|
db_kwargs['password'] = parsed_url.password
|
||||||
|
|
||||||
return SCHEME_DRIVERS[parsed_url.drivername](parsed_url.database, **db_kwargs)
|
return SCHEME_DRIVERS[parsed_url.drivername](parsed_url.database, **db_kwargs)
|
||||||
|
|
||||||
|
|
|
@ -20,12 +20,12 @@ def get_id(query):
|
||||||
|
|
||||||
def upgrade():
|
def upgrade():
|
||||||
conn = op.get_bind()
|
conn = op.get_bind()
|
||||||
event_id = get_id('Select id From externalnotificationevent Where name="repo_push" Limit 1')
|
event_id = get_id('Select id From externalnotificationevent Where name=\'repo_push\' Limit 1')
|
||||||
method_id = get_id('Select id From externalnotificationmethod Where name="webhook" Limit 1')
|
method_id = get_id('Select id From externalnotificationmethod Where name=\'webhook\' Limit 1')
|
||||||
conn.execute('Insert Into repositorynotification (uuid, repository_id, event_id, method_id, config_json) Select public_id, repository_id, %s, %s, parameters FROM webhook' % (event_id, method_id))
|
conn.execute('Insert Into repositorynotification (uuid, repository_id, event_id, method_id, config_json) Select public_id, repository_id, %s, %s, parameters FROM webhook' % (event_id, method_id))
|
||||||
|
|
||||||
def downgrade():
|
def downgrade():
|
||||||
conn = op.get_bind()
|
conn = op.get_bind()
|
||||||
event_id = get_id('Select id From externalnotificationevent Where name="repo_push" Limit 1')
|
event_id = get_id('Select id From externalnotificationevent Where name=\'repo_push\' Limit 1')
|
||||||
method_id = get_id('Select id From externalnotificationmethod Where name="webhook" Limit 1')
|
method_id = get_id('Select id From externalnotificationmethod Where name=\'webhook\' Limit 1')
|
||||||
conn.execute('Insert Into webhook (public_id, repository_id, parameters) Select uuid, repository_id, config_json FROM repositorynotification Where event_id=%s And method_id=%s' % (event_id, method_id))
|
conn.execute('Insert Into webhook (public_id, repository_id, parameters) Select uuid, repository_id, config_json FROM repositorynotification Where event_id=%s And method_id=%s' % (event_id, method_id))
|
||||||
|
|
|
@ -203,7 +203,7 @@ def upgrade():
|
||||||
sa.Column('id', sa.Integer(), nullable=False),
|
sa.Column('id', sa.Integer(), nullable=False),
|
||||||
sa.Column('user_id', sa.Integer(), nullable=False),
|
sa.Column('user_id', sa.Integer(), nullable=False),
|
||||||
sa.Column('service_id', sa.Integer(), nullable=False),
|
sa.Column('service_id', sa.Integer(), nullable=False),
|
||||||
sa.Column('service_ident', sa.String(length=255, collation='utf8_general_ci'), nullable=False),
|
sa.Column('service_ident', sa.String(length=255), nullable=False),
|
||||||
sa.ForeignKeyConstraint(['service_id'], ['loginservice.id'], ),
|
sa.ForeignKeyConstraint(['service_id'], ['loginservice.id'], ),
|
||||||
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
|
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
|
||||||
sa.PrimaryKeyConstraint('id')
|
sa.PrimaryKeyConstraint('id')
|
||||||
|
@ -375,7 +375,7 @@ def upgrade():
|
||||||
sa.Column('command', sa.Text(), nullable=True),
|
sa.Column('command', sa.Text(), nullable=True),
|
||||||
sa.Column('repository_id', sa.Integer(), nullable=False),
|
sa.Column('repository_id', sa.Integer(), nullable=False),
|
||||||
sa.Column('image_size', sa.BigInteger(), nullable=True),
|
sa.Column('image_size', sa.BigInteger(), nullable=True),
|
||||||
sa.Column('ancestors', sa.String(length=60535, collation='latin1_swedish_ci'), nullable=True),
|
sa.Column('ancestors', sa.String(length=60535), nullable=True),
|
||||||
sa.Column('storage_id', sa.Integer(), nullable=True),
|
sa.Column('storage_id', sa.Integer(), nullable=True),
|
||||||
sa.ForeignKeyConstraint(['repository_id'], ['repository.id'], ),
|
sa.ForeignKeyConstraint(['repository_id'], ['repository.id'], ),
|
||||||
sa.ForeignKeyConstraint(['storage_id'], ['imagestorage.id'], ),
|
sa.ForeignKeyConstraint(['storage_id'], ['imagestorage.id'], ),
|
||||||
|
|
|
@ -69,8 +69,7 @@ class TooManyUsersException(DataModelException):
|
||||||
|
|
||||||
|
|
||||||
def is_create_user_allowed():
|
def is_create_user_allowed():
|
||||||
return get_active_user_count() < config.app_config['LICENSE_USER_LIMIT']
|
return True
|
||||||
|
|
||||||
|
|
||||||
def create_user(username, password, email):
|
def create_user(username, password, email):
|
||||||
""" Creates a regular user, if allowed. """
|
""" Creates a regular user, if allowed. """
|
||||||
|
|
|
@ -42,24 +42,6 @@ class SuperUserLogs(ApiResource):
|
||||||
abort(403)
|
abort(403)
|
||||||
|
|
||||||
|
|
||||||
@resource('/v1/superuser/seats')
|
|
||||||
@internal_only
|
|
||||||
@show_if(features.SUPER_USERS)
|
|
||||||
@hide_if(features.BILLING)
|
|
||||||
class SeatUsage(ApiResource):
|
|
||||||
""" Resource for managing the seats granted in the license for the system. """
|
|
||||||
@nickname('getSeatCount')
|
|
||||||
def get(self):
|
|
||||||
""" Returns the current number of seats being used in the system. """
|
|
||||||
if SuperUserPermission().can():
|
|
||||||
return {
|
|
||||||
'count': model.get_active_user_count(),
|
|
||||||
'allowed': app.config.get('LICENSE_USER_LIMIT', 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
abort(403)
|
|
||||||
|
|
||||||
|
|
||||||
def user_view(user):
|
def user_view(user):
|
||||||
return {
|
return {
|
||||||
'username': user.username,
|
'username': user.username,
|
||||||
|
|
|
@ -32,5 +32,6 @@ raven
|
||||||
python-ldap
|
python-ldap
|
||||||
pycrypto
|
pycrypto
|
||||||
logentries
|
logentries
|
||||||
|
psycopg2
|
||||||
git+https://github.com/DevTable/aniso8601-fake.git
|
git+https://github.com/DevTable/aniso8601-fake.git
|
||||||
git+https://github.com/DevTable/anunidecode.git
|
git+https://github.com/DevTable/anunidecode.git
|
||||||
|
|
|
@ -44,6 +44,7 @@ python-dateutil==2.2
|
||||||
python-ldap==2.4.15
|
python-ldap==2.4.15
|
||||||
python-magic==0.4.6
|
python-magic==0.4.6
|
||||||
pytz==2014.4
|
pytz==2014.4
|
||||||
|
psycopg2==2.5.3
|
||||||
raven==5.0.0
|
raven==5.0.0
|
||||||
redis==2.10.1
|
redis==2.10.1
|
||||||
reportlab==2.7
|
reportlab==2.7
|
||||||
|
|
|
@ -2699,35 +2699,7 @@ function SuperUserAdminCtrl($scope, ApiService, Features, UserService) {
|
||||||
}, ApiService.errorDisplay('Cannot delete user'));
|
}, ApiService.errorDisplay('Cannot delete user'));
|
||||||
};
|
};
|
||||||
|
|
||||||
var seatUsageLoaded = function(usage) {
|
$scope.loadUsers();
|
||||||
$scope.usageLoading = false;
|
|
||||||
|
|
||||||
if (usage.count > usage.allowed) {
|
|
||||||
$scope.limit = 'over';
|
|
||||||
} else if (usage.count == usage.allowed) {
|
|
||||||
$scope.limit = 'at';
|
|
||||||
} else if (usage.count >= usage.allowed * 0.7) {
|
|
||||||
$scope.limit = 'near';
|
|
||||||
} else {
|
|
||||||
$scope.limit = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$scope.chart) {
|
|
||||||
$scope.chart = new UsageChart();
|
|
||||||
$scope.chart.draw('seat-usage-chart');
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.chart.update(usage.count, usage.allowed);
|
|
||||||
};
|
|
||||||
|
|
||||||
var loadSeatUsage = function() {
|
|
||||||
$scope.usageLoading = true;
|
|
||||||
ApiService.getSeatCount().then(function(resp) {
|
|
||||||
seatUsageLoaded(resp);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
loadSeatUsage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function TourCtrl($scope, $location) {
|
function TourCtrl($scope, $location) {
|
||||||
|
|
|
@ -8,9 +8,6 @@
|
||||||
<div class="col-md-2">
|
<div class="col-md-2">
|
||||||
<ul class="nav nav-pills nav-stacked">
|
<ul class="nav nav-pills nav-stacked">
|
||||||
<li class="active">
|
<li class="active">
|
||||||
<a href="javascript:void(0)" data-toggle="tab" data-target="#license">License and Usage</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:void(0)" data-toggle="tab" data-target="#users" ng-click="loadUsers()">Users</a>
|
<a href="javascript:void(0)" data-toggle="tab" data-target="#users" ng-click="loadUsers()">Users</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -19,19 +16,8 @@
|
||||||
<!-- Content -->
|
<!-- Content -->
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<!-- License tab -->
|
|
||||||
<div id="license" class="tab-pane active">
|
|
||||||
<div class="quay-spinner 3x" ng-show="usageLoading"></div>
|
|
||||||
<!-- Chart -->
|
|
||||||
<div>
|
|
||||||
<div id="seat-usage-chart" class="usage-chart limit-{{limit}}"></div>
|
|
||||||
<span class="usage-caption" ng-show="chart">Seat Usage</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Users tab -->
|
<!-- Users tab -->
|
||||||
<div id="users" class="tab-pane">
|
<div id="users" class="tab-pane active">
|
||||||
<div class="quay-spinner" ng-show="!users"></div>
|
<div class="quay-spinner" ng-show="!users"></div>
|
||||||
<div class="alert alert-error" ng-show="usersError">
|
<div class="alert alert-error" ng-show="usersError">
|
||||||
{{ usersError }}
|
{{ usersError }}
|
||||||
|
|
|
@ -37,7 +37,7 @@ from endpoints.api.repository import RepositoryList, RepositoryVisibility, Repos
|
||||||
from endpoints.api.permission import (RepositoryUserPermission, RepositoryTeamPermission,
|
from endpoints.api.permission import (RepositoryUserPermission, RepositoryTeamPermission,
|
||||||
RepositoryTeamPermissionList, RepositoryUserPermissionList)
|
RepositoryTeamPermissionList, RepositoryUserPermissionList)
|
||||||
|
|
||||||
from endpoints.api.superuser import SuperUserLogs, SeatUsage, SuperUserList, SuperUserManagement
|
from endpoints.api.superuser import SuperUserLogs, SuperUserList, SuperUserManagement
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -40,7 +40,7 @@ from endpoints.api.organization import (OrganizationList, OrganizationMember,
|
||||||
from endpoints.api.repository import RepositoryList, RepositoryVisibility, Repository
|
from endpoints.api.repository import RepositoryList, RepositoryVisibility, Repository
|
||||||
from endpoints.api.permission import (RepositoryUserPermission, RepositoryTeamPermission,
|
from endpoints.api.permission import (RepositoryUserPermission, RepositoryTeamPermission,
|
||||||
RepositoryTeamPermissionList, RepositoryUserPermissionList)
|
RepositoryTeamPermissionList, RepositoryUserPermissionList)
|
||||||
from endpoints.api.superuser import SuperUserLogs, SeatUsage, SuperUserList, SuperUserManagement
|
from endpoints.api.superuser import SuperUserLogs, SuperUserList, SuperUserManagement
|
||||||
|
|
||||||
try:
|
try:
|
||||||
app.register_blueprint(api_bp, url_prefix='/api')
|
app.register_blueprint(api_bp, url_prefix='/api')
|
||||||
|
|
Reference in a new issue