Commit Graph

73 Commits

Author SHA1 Message Date
Cyril Roelandt 76abb227ad glance-manage: fix crash under Python3.11
In Python3.11, the argparse module became stricter. While the following
code was fine in previous versions, it will now raise an
argparse.ArgumentError because we added the same subparser twice:

import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='Commands')
subparsers.add_parser('foo')
subparsers.add_parser('foo')
subparsers.add_parser('bar')
parser.parse_args()

This mistake was silently ignore in Python3.10, which explains why this
was never an issue for glance-manage.

Closes-Bug: #1982426
Change-Id: I3a88ab5d2e67a1553f03b0b8ba44efbef976ffb0
2022-07-21 02:33:34 +02:00
Mitya_Eremeev 360dc45680 glance-manage can purge all deleted rows
When we want to purge all deleted rows
we use "glance-manage db purge" or
"glance-manage purge_images_table"
then we never know how many deleted rows are still in a table.
So we need to launch the command many times until
the command reports that 0 rows were deleted in every table.
It's inconvenient.
The patch introduced new valid value for "max_rows".
If "max_rows" equals -1 all deleted rows are purged.

Closes-Bug: 1702445
Change-Id: Ia9811d93b1c0b67a1b29a9e8ee3e0fc098c57d4a
2022-05-05 17:31:35 +03:00
Stephen Finucane 6bd7c188ee Remove six.text_type, six.binary_type usage
Change-Id: I2ed464202f8b645aed11490e111c61d3c7423c11
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2022-01-27 14:54:00 +00:00
Stephen Finucane 5cb97f3a40 trivial: Remove references to sqlalchemy-migrate
Change-Id: I9eda5e5ac697c110e6047c6086855e04cbfe6b87
Implements: blueprint remove-sqlalchemy-migrate
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-07-13 17:19:03 +01:00
Stephen Finucane 7fb274f6db db: Stop checking for DB under sqlalchemy-migrate control
This has been in place since Ocata. If any version since then has been
deployed, this will have already been deployed. Time to drop this.

UpgradeImpact

Change-Id: I5412d78c63cf3381782f5c6fc059641489f89053
Implements: blueprint remove-sqlalchemy-migrate
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-07-13 17:18:52 +01:00
Zuul 7ed2cc9e14 Merge "Stop to use the __future__ module." 2020-07-16 00:12:29 +00:00
Erno Kuvaja 673666cbf4 Deprecation cleanout Registry and related
This patch removes majority of the registry and it's related
endpoints and config options that has been deprecated for
removal in various releases.

Change-Id: I75014bd50bf382efebe56bd89c20ffefbdde25f5
2020-06-30 20:41:30 +01:00
Hervé Beraud 64e3c41167 Stop to use the __future__ module.
The __future__ module [1] was used in this context to ensure compatibility
between python 2 and python 3.

We previously dropped the support of python 2.7 [2] and now we only support
python 3 so we don't need to continue to use this module and the imports
listed below.

Imports commonly used and their related PEPs:
- `division` is related to PEP 238 [3]
- `print_function` is related to PEP 3105 [4]
- `unicode_literals` is related to PEP 3112 [5]
- `with_statement` is related to PEP 343 [6]
- `absolute_import` is related to PEP 328 [7]

[1] https://docs.python.org/3/library/__future__.html
[2] https://governance.openstack.org/tc/goals/selected/ussuri/drop-py27.html
[3] https://www.python.org/dev/peps/pep-0238
[4] https://www.python.org/dev/peps/pep-3105
[5] https://www.python.org/dev/peps/pep-3112
[6] https://www.python.org/dev/peps/pep-0343
[7] https://www.python.org/dev/peps/pep-0328

Change-Id: I82b61a2d7687ff109051815e01619eb612ea9073
2020-06-02 20:14:31 +02:00
Erno Kuvaja 864d1ad714 Change default age of purge_images_table to 180
The `glance manage purge-images-table` is supposed to be used
only if really required due to OSSN-0075. And the advice is
not to purge any freshly deleted rows due to the possible
ID collision of still in use images. This change increases
the default of "age_in_days" to 180 from it's original 30 to
stress this out. User can still define smaller age if they
must.

Change-Id: Idb13288b72b31940a357fc9b11db2d6bcd396261
2018-07-06 13:05:23 +01:00
Abhishek Kekane 5cc9d99935 Mitigate OSSN-0075
Modified the current ``glance-manage db purge`` command to eliminate images
table from purging the records. Added new command
``glance-manage db purge_images_table`` to purge the records from images
table.

DocImpact
SecurityImpact

Change-Id: Ie6641659b54543ed9f96c393d664e52a26bfaf6a
Implements: blueprint mitigate-ossn-0075
2018-07-05 13:33:36 +00:00
Abhishek Kekane 14e8a7b53b Triggers shouldn't be execute in offline migration
Recently this change [1] in glance-manage db_sync is internally
using Expand, Migrate and Contract. EMC is explicitly used for
online migration for which glance uses triggers to sync data
between old columns and new columns. DB Sync is used for
offline migartion for which adding triggers is not required.

Made provision to execute triggers explicitly in case of
online migration (EMC pattern) and skip the same in
case of offline migration (db sync).

[1] https://review.openstack.org/#/c/433934/

Closes-Bug: #1749640
Change-Id: I816c73405dd61d933182ad5efc24445a0add4eea
2018-02-21 03:40:13 +00:00
Abhishek Kekane 28fb47092f Migration support for postgresql
After recent change in manage command [1] deploying glance with
postgres using stack.sh fails as db_sync internally uses E-M-C
and it has support only for mysql.

Added flag online_migration which will be False in case of
db_sync so that enigne check will be eliminated and True in case
of running expand, migrate, contract to perform validatio check on
engine type.

[1] https://review.openstack.org/#/c/433934/

Closes-Bug: #1749466
Change-Id: Ifddeff139e212564118520f3150db198ab1c94f4
2018-02-20 17:48:11 +00:00
shilpa.devharakar 5a5762b71c Add validation to check if E-M-C is already in sync
If you run expand and migrate commands for the second time,
it should return a user friendly message instead of attempting
to upgrade db again.

Added a check to confirm if expand and migrate are already in
sync and return a user friendly message.

Closes-Bug: #1745360
Change-Id: Iaf2e8ae2004db03f9b7498a2c498360fec096066
2018-02-15 19:28:01 +05:30
Abhishek Kekane 106de18f32 Offline migration support for postgresql
After recent change in manage command [1]
deploying glance with postgres using stack.sh
fails as db_sync internally uses E-M-C and it
has support only for mysql.

Made provision to perform offline migration
if database is postgresql.

[1] https://review.openstack.org/#/c/433934/

Change-Id: Ie6c66da8b26930d783526a4b92b77baf493825f9
Closes-Bug: #bug/1747869
2018-02-09 10:06:06 +00:00
Steve Lewis 08d1c7f930 Implementation of db check command
This patch adds a new "glance-manage db check" command
which will check the current state of the users upgrade
repos and relay info back to the user if the user has any
outstanding db upgrades left to run with appropriate exit code.

Co-Authored-By: Bhagyashri Shewale <bhagyashri.shewale@nttdata.com>

Implements: Ie1e2fec2361765ddf23da897abcf0e12e682612e
Change-Id: I1e0b02d615690f65a17b4ccfe4e4a72cc9e15ada
2018-02-08 17:32:33 +05:30
shilpa.devharakar 8682876a8b Exiting with user friendly message and SystemExit()
If you return anything as string to sys.exit method, the system exit
status is one (i.e. failure).
Added user friendly print message and returned without any exit code.

Closes-Bug: #1747690

Change-Id: I107cc1ad4b8d6d0ebee1127fc1e57db55c7cd839
2018-02-07 13:15:46 +05:30
shilpa.devharakar f268df1cbc Modify glance manage db sync to use EMC
Modified 'glance-manage db_sync' operation to use
expand, migrate and contract operations.
Added test queens scripts for testing purpose only.

This patch removes use of "monolithic" upgrade scripts
and resolve the issue while upgrading from ocata to pike.

Co-Authored-By: Shilpa Devharakar <Shilpa.Devharakar@nttdata.com>
Closes-Bug: #1723001

Change-Id: I2653560d637a6696f936b49e87f16326fd601dfe
2018-02-05 17:00:57 +05:30
ChangBo Guo(gcb) e78ab76fa1 Remove usage of parameter enforce_type
Oslo.config deprecated parameter enforce_type and change its
default value to True in Ifa552de0a994e40388cbc9f7dbaa55700ca276b0.
Remove the usage of it to avoid DeprecationWarning: "Using the
'enforce_type' argument is deprecated in version '4.0' and will be
removed in version '5.0': The argument enforce_type has changed its
default value to True and then will be removed completely."

Change-Id: If045d76574823f29c58b39a104354abc1407cb8d
Related--Bug: #1517839
2017-05-31 14:32:20 +08:00
Ravi Shekhar Jethani c9a21f655e Provide user friendly message for FK failure
'glance-manage db purge' command fails with DBReferenceError due
to FK constraint failure and exits with stack-trace on the command
prompt.

Made changes to give user-friendly error message to the user as
well as log appropriate error message in glance-manage logs
instead of stack-trace.

Co-author-by: Dinesh Bhor <dinesh.bhor@nttdata.com>
Change-Id: I52e56b69f1b78408018c837d71d75c6df3df9e71
Closes-Bug: #1554412
2017-04-05 15:56:32 +05:30
Hemanth Makkapati 9859df2d1f Add expand/migrate/contract migrations for CI
This patch adds equivalent expand/migrate/contract migration scripts for
Community Images. The expand migration
'ocata_expand01_add_visibility.py' creates a new migration branch 'expand'
from the last known migration i.e., 'mitaka02'. Similarly, the contract
migration 'ocata_contract01_drop_is_public.py' creates another new
migration branch called 'contract' from the last known migration.

The data migration 'ocata_migrate01_community_images.py' migrates
all rows in the database at once. There is possibility of performance
degradation while the data migrations are running.

Change-Id: I34f5623d6804e9fe594e6b5b196ea4a162578196
Partially-Implements: blueprint database-strategy-for-rolling-upgrades
Co-Authored-By: Hemanth Makkapati <hemanth.makkapati@rackspace.com>
Depends-On: Ie839e0f240436dce7b151de5b464373516ff5a64
2017-02-02 00:16:04 +00:00
Alexander Bashmakov 0f0354a8b8 Add expand/migrate/contract commands to glance-manage CLI
The parent of this patch introduced the change to Alembic-based
migrations. This commit builds on top of that by adding expand,
migrate and contract commands to the glance-manage tool.
Appropriate documentation is updated and failing tests are adjusted
to accomodate the new database versioning schema.

Data migrations are expected to be run in the background with older
Glance services being active during the upgrade process.

Partially-Implements: blueprint database-strategy-for-rolling-upgrades
Co-Authored-By: Hemanth Makkapati <hemanth.makkapati@rackspace.com>
Change-Id: Ie839e0f240436dce7b151de5b464373516ff5a64
Depends-On: I77921366a05ba6f9841143af89c1f4059d8454c6
2017-02-01 23:23:11 +00:00
Hemanth Makkapati 21d431013f Port Glance Migrations to Alembic
This change proposes the use of Alembic to manage Glance migrations.
* Introduce new directory ``alembic_migrations`` under
  ``glance/db/sqlalchemy``. This directory is the home for all glance
  migrations henceforth. All the migration scripts reside under
  ``versions`` directory.
* All the migrations up to Liberty are consolidated into one migration
  called ``liberty_initial`` as those migrations are not supported
  any more. Mitaka migrations are retained but under a different naming
  convention.
* All the glance manage db commands are changed appropriately. They now
  use alembic to perform operations such as ``version``, ``upgrade``,
  ``sync`` and ``version_control``.
* The database versions are not numerical any more. They are the revision
  ID of the last migration applied on the database. Since we don't
  support migrations before Mitaka, the Liberty version ``42`` will now
  appear as ``liberty``. Migration ``43`` and ``44`` in Mitaka appear as
  ``mitaka01`` and ``mitaka02`` respectively.
* When one performs a ``sync`` or ``upgrade`` command, the database is
  first stamped with an equivalent alembic version before upgrading.
* The older migration scripts are retained so that users can correlate
  with the new migrations. Also, it is probably safe to retain them until
  the alembic migrations become stable. Similarly, the ``migrate_version``
  table is not removed yet.

Partially-Implements: blueprint alembic-migrations

Change-Id: Ie8594ff339a13bf190aefa308f54e97ee20ecfa2
Co-Authored-By: Alexander Bashmakov <alexander.bashmakov@intel.com>
Depends-On: I1596499529af249bc48dfe859bbd31e90c48a5e0
2017-01-31 22:42:43 -06:00
Alexander Bashmakov d4f07cc322 Allow purging of records less than 1 day old.
Adding ability to purge records less than 1 day old, using the
glance-manage db_purge utility.

Closes-Bug: #1643287

Change-Id: Ibaea583d49bd5d09ad2e6bf99d2c0efaac5cb4ec
2016-12-05 21:28:24 +00:00
Ian Cordasco b2cd0775ec Prepare for oslo.log 3.17.0
The 3.17.0 release of oslo.log changes the default value of "use_stderr"
to False (from True). We had tests that asserted that our glance-*
commands used stderr to provide information to administrators. This
works to preserve that default value for operators by overriding the
default to True when we're running in one of those commands.

We deliberately excluded glance-api, glance-glare, and glance-registry
because glance-api and glance-registry are usually not run manually and
they don't need to log to stderr by default and glance-glare is
deprecated.

Change-Id: Ia054f8f637c826280722c0d2a6811fdbc0cf54ed
2016-11-29 10:20:43 -06:00
wangxiyuan 2f803d3fa9 Remove DB downgrade
As downgrade are not supported after Kilo, we should remove them now.
Roll backs can be performed as mentioned in the below link:
http://docs.openstack.org/ops-guide/ops-upgrades.html#rolling-back-a-failed-upgrade

The DB downgrades were deprecated in Glance Mitaka release by commit
e3366afdfb.

Change-Id: I937d15d93f16a3e44a50e6ff1a469098eab67c79
Implements: blueprint remove-db-downgrade
2016-09-01 10:53:08 +08:00
Jenkins 068cf60808 Merge "Add check to limit maximum value of max_rows" 2016-07-30 22:32:41 +00:00
yuyafei f9613c77fb Remove unused LOG to keep code clean
TrivialFix

Change-Id: Id1b19986c4a740a512ef4cb9615a727321be1654
2016-07-09 10:13:50 +08:00
Dinesh Bhor 9338e5c046 Add check to limit maximum value of max_rows
Currently 'glance-manage db purge' fails if given a
very large number for max_rows.

Moved and renamed validate_mysql_int() from
glance.common.utils to glance.db.sqlalchemy.api as
_validate_db_int() since it is related to database
only so that it can be used to validate max_rows
for maximum limit.

Closes-Bug: #1543937
Change-Id: Id16694807c180632c1785e9b1ebe8d1c79d885ab
2016-05-30 09:20:27 +05:30
Bertrand Lallau 4ad190bc13 Remove unnecessary executable permissions
Removes executable permissions on python modules not requiring it.

Change-Id: I6d930ea1fc62433377959257f0a0e5e3da11d97c
2016-05-23 21:48:22 +02:00
dineshbhor 371043656b Fix db purge type validation
Moved validation for age_in_days and max_rows from
glance.db.sqlalchemy.api to glance.cmd.manage since
code from purge_deleted_rows() method of
glance.db.sqlalchemy.api is unreachable as it is
throwing ValueError exception for invalid input from
glance.cmd.manage itself.

Related-Bug: #1543937
Change-Id: I4e976fde2a78fd901c233966adc350a0ded41841
2016-03-24 13:12:03 +00:00
Jenkins f17fcd1a43 Merge "Add a deprecation warning to the DB downgrade" 2016-03-08 14:38:20 +00:00
Michael Krotscheck 7a93458baa Moved CORS middleware configuration into oslo-config-generator
The default values needed for glance's implementation of cors
middleware have been moved from paste.ini into the configuration
hooks provided by oslo.config. Furthermore, these values have been
added to glance's default configuration parsing. This ensures
that if a value remains unset in glance-api.conf, it will be set to use
sane defaults, and that an operator modifying the configuration
file will be presented with a default set of necessary sane headers.

Change-Id: I3c9d267b6224d6c7e5cc2c41cb51fb7e363c4955
Closes-Bug: 1551836
2016-03-02 07:48:05 -08:00
Qiaowei Ren fc53a11ce3 Replace exit() by sys.exit()
sys.exit() is considered good to use in programs.

Change-Id: I2cd75a15e7ec82c502c22f0be6440b6db4c9a94a
2016-02-03 10:13:52 +08:00
Martin Mágr 9a6823326b Add db purge command
This patch adds "db purge" to glance-manage for deleting soft deleted
images, tasks.

Change-Id: I5b609292aa15f8133d0d785fcf9143825bed8073
Implements: blueprint database-purge
2015-12-11 19:16:58 +01:00
kairat_kushaev c27c25f779 Import i18n functions directly
Import i18n functions from module directly and do not use
global module variables like _ = i18n._. It makes code shorter
and cleaner. It also to detect cases when these functions are not
used in module.

Change-Id: Iaa593ac1f2dd15cbcad049bef6ba68f1cfa610da
2015-12-07 18:20:43 +03:00
wangxiyuan e3366afdfb Add a deprecation warning to the DB downgrade
DB downgrade doesn't be supported in OpenStack now. Glance will
remove it in N release. In M cycle, we should add a warning to users.

Closes-bug: #1501233
Implements: blueprint remove-db-downgrade
Change-Id: I2791d8421abc0ad6c4905d5ddaa3fa99f264e333
2015-11-06 09:08:23 +08:00
Victor Stinner 1c186e23fd Use oslo_utils.encodeutils.exception_to_unicode()
* Replace glance.common.utils.exception_to_str() with
  oslo_utils.encodeutils.exception_to_unicode().
* Remove exception_to_str() from glance.common.utils
* Add "from oslo_utils import encodeutils" and remove "from
  glance.common import utils" (when utils is no more used)
* glance/api/v2/images.py: replace utils.exception_to_str() with
  six.text_type() to cast the oslo_i18n message to Unicode

Glance exception_to_str() function was not compatible with Python 3,
whereas exception_to_unicode() is compatible with Python 3, it's in Oslo
common libraries and it's well tested.

This patch was first generated by a tool (modified version of sixer),
and then fixed to respect the PEP8 (especially the constraint of 80
columns).

Change-Id: I86008c8adc0c5664f96573c1015cc15e2d06e3e2
2015-07-17 18:31:03 +02:00
PranaliDeore 68c2a323bd Remove unused imported marker functions
Removed unused imported marker functions
( _LI = i18n._LI, _LW = i18n._LW) from several
places.

Closes-Bug: #1431243
Change-Id: I71b551bfa72631036fcf9d2c38701d74a0e14611
2015-06-29 05:57:37 +00:00
Kamil Rykowski fd2057d521 glance-manage output when ran without any arguments
The glance-manage command isn't very helpful when it is run without any
arguments. The current output looks like following:

$ glance-manage
usage: glance-manage [options] <cmd>
glance-manage: error: too few arguments

This patch extends the default output to look similar to what can be
seen in the cinder-manage tool. The new output is:

$ glance-manage
/usr/local/bin/glance-manage category action [<args>]
Available categories:
	db

Change-Id: I2c56ccf5a28cdaf9fdfb03d79763b34dc096a858
Closes-Bug: #1394316
2015-04-08 15:08:32 +00:00
Jenkins bb59c33ffc Merge "Move to graduated oslo.log module" 2015-03-13 01:31:16 +00:00
Louis Taylor 0acff569e0 Move to graduated oslo.log module
This removes the log module from the oslo incubator directory.

Change-Id: Ib017cc2777e27c58b376c3138c9fba614783cc34
2015-03-12 11:48:24 +00:00
Pawel Koniszewski b55ae36fcf Provide a way to upgrade metadata definitions
Currently there is no way to upgrade metadata definitions to the
newest set. This change extends existing command:
glance-manage db load_metadefs.

The extension allows user to merge metadata definitions that are
stored in files with data that exists in database. By default it
prefers existing data over new (--merge), but it can be combined
with other options to change this logic. Use --prefer_new flag so
it will prefer new data over existing data in database or
--overwrite so it will drop every namespace (and attached
resources) found in both, database and file.

By default glance-manage db load_metadefs works the same way it
worked before extension. To enable new logic user needs to
provide at least --merge option (or combine it with other two
options)

Implements: blueprint metadefs-upgrade-by-json-file
Change-Id: I55fa6640142db5110deb88d9ecd8507e7f533c58
2015-03-12 00:26:16 -04:00
Louis Taylor e42fad7385 Move from oslo.db to oslo_db
oslo_db was moved out of the oslo namespace in
oslo.db>=1.4.0.

Change-Id: I13620d26ff12c55b2294b3b051669e0e98513a10
Related-to: blueprint drop-namespace-packages
2015-01-12 19:03:20 +00:00
Louis Taylor d759a6fd1a Move from oslo.config to oslo_config
oslo_config was moved out of the oslo namespace in oslo.config>=1.6.0.

Related-to: blueprint drop-namespace-packages

Change-Id: I30ecbf8f9de77496fcb643c7ad9738d79ad359f0
2015-01-12 14:34:22 +00:00
Louis Taylor 41d45dfb1c Move from oslo.utils to oslo_utils
oslo_utils has been moved out of the oslo namespace.

bp drop-namespace-packages

Change-Id: Ie818e72b31efd2a6ab182444967bdfaca9366f4a
2015-01-09 20:01:42 +00:00
Ian Cordasco 8a02cf035c Generate glance-manage.conf
As specified in the blueprint, we are only going to set log_file in the
configuration file for now, and we read it last in glance.cmd.manage.
This allows glance-manage to use the appropriate log-file and still
retain the settings it needs in glance-api.conf and glance-registry.conf

DocImpact

Change-Id: I87595a29634e6ffda4e1581d42a92dfe6f84044b
Implements: blueprint create-glance-manage-conf
Closes-bug: #1391211
2014-12-18 10:23:32 -06:00
Erno Kuvaja fa7888d920 Change Glance to use i18n instead of gettextutils
Changing all Glance files to use i18n instead of gettextutils for log
translations.

Finishes bp refactoring-glance-logging

Change-Id: I90d6ab4f7e09f4e7591921f9526de6370ebdb789
2014-11-21 17:12:35 +00:00
Julien Danjou 874e643549 Switch to oslo.utils
Change-Id: I47dc734c6d6e2ab99c25701ae3492acd5e442212
2014-10-07 14:55:57 +02:00
Zhi Yan Liu ee842bbb66 Remove db_enforce_mysql_charset option for db_sync of glance-manage
This is a deprecated option only should be used for migration. As we
scheduled before, now glance removes it out from Juno release.

Change-Id: Ice4ade659307ee5e635a75d6637b4664ee431c20
Signed-off-by: Zhi Yan Liu <zhiyanl@cn.ibm.com>
2014-09-22 21:45:56 +08:00
Zhi Yan Liu 819f28a0b8 Enabling separated sample config file generation
As a common approach most projects used now and Oslo preferred, this
change enabled sample configuration file generation mechanism for
each Glance services.

This change, as an enhancement, allows generating separated sample
configuration files for each Glance major services, e.g.:

    etc/glance-api.conf.sample
    etc/glance-cache.conf.sample
    etc/glance-manage.conf.sample
    etc/glance-registry.conf.sample
    etc/glance-scrubber.conf.sample

It is different than I94d486d6686815c45705a7a9b00fb26062e1eb63
which only supports generating an unified sample configuration
file to including all Glance available options.

This mechanism  not only can help auditing by packager, milestone
maintainer or developer as a function (testenv) of tox, but also
those separated configuration files could make deployment be easy.
And it helps keeping sample configuration files be update with
code change.

The change added "genconfigs" function as a tox testenv (-egenconfigs),
and it dependes on oslo-config-generator function of oslo.config.

The change doesn't introduce those sample files Glance repo, so
next step is to investigate if we can generate them in gate
automatically when a change was merged.

Related-Change-Id: I15686708fc9460948a58cfea3d18dae40ba1fda9
Related-Change-Id: Iae31856d5886ee78786972d80c7c103c3460a2b3
Related-Change-Id: I76043b08e2872867e5af2a5ac902e4d092fda5c8
Closes-Bug: #1300546
Closes-Bug: #1361963

Change-Id: Ibe03a3fe80b96ca32acb1a6bea7e38e6075951bb
Signed-off-by: Zhi Yan Liu <zhiyanl@cn.ibm.com>
2014-09-17 13:19:00 +08:00