openstack-common:cfg now is ported to argparse

The cfg API is currently based on optparse which has been deprecated in favour of argparse.

We should switch to argparse, hopefully without needing to change the API too radically.

With argparse supported added, we can also consider exposing some argparse APIs through the cfg API – for example, we could add a add_subparsers() method which would allow cfg API users to parse sub-commands using argparse.

please refer to Cfg_argparse_blueprint

Posted in OpenShift | OpenStack | Hadoop | Leave a comment

关于nfs文件系统

在一个暴露出的nfs文件系统上编辑文件失败,现象是,普通用户可读写,root用户可读但是不能写入。

经过调查,这个现象与root_squash参数有关。

root_squash:要求将 uid/gid 0 用户的访问映射为 anonymous 用户访问,因此读会失败。
设置为 no_root_squash 后,达到预期。

Posted in Uncategorized | Leave a comment

How to add wsgi module to Apache on SuSE

Easy…

#!/usr/bin/env bash

if ! $(/usr/sbin/a2enmod -q wsgi); then
    sudo /usr/sbin/a2enmod wsgi
fi

/usr/sbin/apache2ctl -M

/usr/sbin/apache2ctl restart

Posted in Uncategorized | Leave a comment

distribute 0.6.28 failed while inter-operating with pip-1.2

distribute-issue-327

I found this error, when I was trying to setup a virtualenv for a openstack project.

I followed and found out, this issue is related to reordering of options of pip-1.2, –single-version-externally-managed and –record

error message is as below:

Installing collected packages: distribute
...
    Patched done.
    Relaunching...
    Traceback (most recent call last):
      File "", line 1, in 
    NameError: name 'install' is not defined
    Complete output from command /somedir/.venv/bin/python -c "import setuptools;__file__='/tmp/pip-Z_PVGT-build/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-tNsiFL-record/install-record.txt --single-version-externally-managed --install-headers /somedir/.venv/include/site/python2.7:
    Before install bootstrap.

Scanning installed packages

Setuptools installation detected at /somedir/.venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg

Egg installation

Patching...

Renaming /somedir/.venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg into /somedir/.venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg.OLD.1349359821.3

Patched done.

Relaunching...

Traceback (most recent call last):

  File "", line 1, in 

NameError: name 'install' is not defined

what was causing this error is related to reordering of options of pip-1.2, –single-version-externally-managed and –record.

a work around is

export VIRTUALENV_DISTRIBUTE=true

the bug residents in file distribute_setup.py.
before:

def _relaunch():
    log.warn('Relaunching...')
    # we have to relaunch the process
    # pip marker to avoid a relaunch bug
    _cmd = ['-c', 'install', '--single-version-externally-managed']
    if sys.argv[:3] == _cmd:
        sys.argv[0] = 'setup.py'
    args = [sys.executable] + sys.argv
    sys.exit(subprocess.call(args))

quick fix:

def _relaunch():
    log.warn('Relaunching...')
    # we have to relaunch the process
    # pip marker to avoid a relaunch bug
    _cmd1 = ['-c', 'install', '--single-version-externally-managed']
    _cmd2 = ['-c', 'install', '--record']
    if sys.argv[:3] == _cmd1 or sys.argv[:3] == _cmd2:
        sys.argv[0] = 'setup.py'
    args = [sys.executable] + sys.argv
    sys.exit(subprocess.call(args))
Posted in OpenShift | OpenStack | Hadoop, PHP | Python | Leave a comment

Gerrit工作流程快速参考

(原文:http://wiki.openstack.org/GerritWorkflow)

本文主旨:从一个新的版本库开始工作,所需命令的快速参考。请完整地阅读本文档,以了解在使用中的工作流程,然后,当您需要开始一个新的OpenStack的项目时,请参阅本文。

更完整地的设置描述,请参阅GerritJenkinsGithub

 

帐户设置

请确保你有一个Launchpad帐户,并上传了你的ssh公共密钥。

访问https://review.openstack.org/,然后,在页面的右上角,点击“ 登录”链接。用您的 Launchpad ID 登录。

因为Gerrit使用Launchpad的OpenID单点登录,你不再需要一个另外的Gerrit密码,一旦你登录到Launchpad、Gerrit或Jenkins其中之一,你就不必为其他的登录而输入您的密码。

Gerrit的帐户会自动同步Launchpad,让您的Gerrit帐户应该已经有了与 Launchpad 相同的用户名、全名、电子邮件地址、SSH密钥和组成员身份。

在Launchpad的一些信息是不公开的,因此可能不会被复制过来。当您第一次登录到Gerrit,你应该点击页面顶部的 Settings 链接,然后请确保您的Contact Information、SSH Public KeysGroup看起来是正确的。如果不正确,请注册您的Email地址和SSH密钥。

确保您执行以下这些步骤,让git的知道您的电子邮件地址:

git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@youremail.com"

检查您的Git配置:

git config --list

 

Git Review 的安装

我们建议您使用“git-review”工具,它是一个git子命令,它处理所有与Gerrit有关的细节,而Gerrit是 OpenStack开发中使用的代码审核系统。在你开始工作之前,请确保在您的系统上安装了git-review。

在Ubuntu,或其他大多数类Unix系统上,这是非常简单的:

pip install git-review

在Ubuntu Precise(12.04)或更高版本上,git-review已经包含在发布里,所以,可以像其他软件包一样安装它:

apt-get install git-review

在Fedora 16和更高版本中,git-review已经包含在发布中,所以可以像其他软件包一样安装它:

yum install git-review

在Fedora 15和更早的版本中,或在Red Hat Enterprise Linux中,你必须安装pip(包名是python-pip),然后使用pip传统的方法安装git-review。

git-review与Gerrit的交互,都是普通的Git命令序列。关于它在做什么,如果你想知道更多,只要增加-v选项,它就会打印出正在执行的所有的命令。

 

项目设置

以通常的方式克隆项目,例如:

git clone git://github.com/openstack/nova.git

现在,您可能要求git-review配置您的项目,以关联Gerrit(但如果你不要求,在您第一次提交修改去审核时,它也会这样做)。要做到这一点(再使用Nova为例):

 cd nova
 git review -s

git-review将检查你是否可以用你的SSH密钥登录到Gerrit。Gerrit假设Gerrit/Launchpad用户名,与当前正在使用的用户一样。如果不行,它会要求Gerrit/Launchpad用户名。

如果你得到的错误:“We don’t know where your gerrit is.”(我们不知道您的Gerrit在哪里。),那么你需要添加一个新的git remote。url应该在错误信息中。复制,并创建新的remote。

git remote add gerrit
ssh://<username>@review.openstack.org:29418/openstack/nova.git

在项目目录中,有一个.git隐藏目录和一个.gitreview隐藏文件。这样,你可以看到他们:

ls -la

 

一般工作流程

一旦你的本地仓库被设置好,必须使用下面的工作流程。

请确保您得到最新的上游修改:

git remote update
git checkout master
git pull origin master

创建一个主题分支来保存你的工作,并切换到它。如果您正在一个蓝图上工作,把您的分支命名为bp/BLUEPRINT,BLUEPRINT是Launchpad蓝图的名字(例如,“bp/authentication”)。否则,给它起一个有意义的名字,因为在Gerrit里,它会显示为修改的标题。

git checkout -b TOPIC-BRANCH

 

提交更改

Git的提交注释应该以短的、50个字符或更少的、一个段落的简述开始。下面的段落应更详细地解释修改内容。

如果您所做的修改解决了一个蓝图或缺陷,一定要在提交的消息中提到他们,使用下面的语法:

blueprint BLUEPRINT
bug #######

例如:

增加 keystone 支持。

实现蓝图认证。修复bug 123456。
 (修改的长描述)。

进行修改编码,提交(commit)他们,并交付(submit)审核:

git commit -a
git review

 

注意

不要检入(checking in)修改到你的主分支上。如果这样做,当你拉新的上游修改时,会导致合并提交,合并提交将不被Gerrit接受。

检入前一定要运行 “./run_tests.sh -p”

 

审核

一旦代码被提交,它出现在https://review.openstack.org 。有关更多信息,请参阅http://wiki.openstack.org/GerritJenkinsGithub 。如果你的代码对应的链接被点击,它会显示状态及其他信息。自动测试将被执行,一旦执行完毕,其结果将显示出来。审核人会来做审核,并在留言框中或在代码中发表评论。

如果有行注释,你可以从扩展的“Patch Set”看到它。“备注”一栏将显示在每个文件中有多少条评论。如果你点击一个有评论的文件名,新的页面会显示出差异页,并带有审核者的名称和注释。点击“回复”,写你的回应。如果你点击“保存”,他将被保存为草稿。现在,返回显示补丁集列表的页面,然后点击“Review”,然后单击“Publish comments”。

如果您的代码还没有准备好进行审核,点击“Work in Prograss” ,以表明审核人现在并不需要对其进行审核。请注意,除非你登录该网站,否则这些按钮是不可见的。

 

草稿

可以作为草案交付(submit)修改,例如,如果还没有准备好进行合并,甚至是一般的代码审核,但是你想有选择性地分享它,以得到早期的意见。如果您上传的修改作为草稿,默认情况下,没有人能看到它们。您必须显式添加你想分享的,作为一个审核人的每个人。审核人可以发表评论,但不能在这个阶段投票。在进化(evolves)过程中,您可以继续上传新的补丁集到这个修改,一旦准备好一般审核,你可以点击“Publish”按钮。随后,它会成为一个常规的Gerrit修改,每个人都可以看到,包括早前的草案阶段的评论。这是一个单向变迁;一旦草案公布(published),它不能被再次成为草案。

通过添加“-D”选项上载草案修改。即,修改,提交修改,交付草案:

git commit -a
git review -D

 

注:

早期版本(1.16以前)git-review也可能有“-D”选项,但Gerrit用以指示一个草案修改的git ref被改变了; 因此,如果使用“-D”的到出错的结果,您可能需要升级到最新。

 

长寿命的主题分支

如果您正在一个较大的项目里工作,你可能会在你的分支上工作一段时间了。在这种情况下,在开发过程中,你可能要经常检入您所做的修改。交付代码审核前,你需要将修改基于master 版本库(master repository)的当前状态。在这种情况下,你应该在交付之前仔细准备。

如果在你开始后,master 版本库已经改变,你应该把修改基于master 版本库(master repository)的当前状态。如果你已经做了很多小的提交,你应该把他们压缩成一个(squash),使他们不会显示在公共库中。请记住:每个提交都将成为Gerrit里的变化,需要另行批准。如果你正在对项目做一个“修改”,为公众的受用,请压缩你的多个“检查点”成一个提交。下面说明了如何做到这些:

git checkout master
git pull origin master
git checkout TOPIC-BRANCH
git rebase -i master

使用编辑器,压缩所有的不应该出现在公众的历史的提交。如果你想将交付给Gerrit一个修改,在这个过程的最后,你应该只有一个“选定”的行。完成后,您将能够在你的编辑器准备提交的注释。从你所选择的提交的注释开始,你开始提交,而且注释应该有一个Change-ID行。在编辑时,一定要留Change-ID行。

在您的分支,一旦提交历史看起来是正确的, 运行 git review,交付你的更改到Gerrit。

 

更新变化

如果代码审核过程中提出额外的修改建议,那么请修改,并修改定现有的提交。保留现有的Change-ID:如提交注释页脚中所写,这样Gerrit就知道,这是一个对现有修改更新的补丁:

git commit -a --amend
git review

 

添加依赖

当你要基于一个正在审核阶段的提交,开始新的工作时,您可以作为依赖添加提交。

#fetch config
git fetch https://review.openstack.org/openstack/nova refs/changes/16/10816/9 && git checkout FETCH_HEAD
git checkout -b SOMEBRANCHNAME
git review -R

*注意*-R选项是非常重要的。如果你漏掉了-R选项,原始提交将被错误的更新。

Posted in Uncategorized | Leave a comment

也说 MySQL ERROR 1045(28000): Access denied…(下)

登录后,登录主机确实显示为localhost,为什么呢?

$ mysql -uuser1 -puser1 -h127.0.0.1 -P3307 -e 'SELECT USER();'
+-----------------+
| USER()          |
+-----------------+
| user1@localhost |
+-----------------+

因为MySQL在接到新的连接请求时,如果客户IP地址在host cache中不存在,就会试图把IP地址转换为hostname,可以通过参数–skip-name-resolve抑制这个行为。
(参考:http://dev.mysql.com/doc/refman/5.0/en/host-cache.html

可是,即便IP被转换为hostname,用户权限中主机部分是通配符‘%’,应该匹配任何主机名和IP地址,不是么?

10. 重现

$ mysql -uroot -h127.0.0.1 -P3307 -e "DROP USER 'user1'@'localhost'"
$ mysql -uuser1 -puser1 -h127.0.0.1 -P3307 db1
ERROR 1045 (28000): Access denied for user 'user1'@'localhost' (using password: YES)

$ mysql -uroot -h127.0.0.1 -P3307 -e 'SELECT host,user FROM mysql.user'
+-------------+-------+
| host        | user  |
+-------------+-------+
| %           | user1 |
| 127.0.0.1   | root  |
| ::1         | root  |
| localhost   |       |
| localhost   | root  |
+-------------+-------+

这是因为,MySQL检查客户端登录的主机名/用户名是有一定顺序的,优先匹配host,然后才匹配user。匹配host时,又要求优先匹配确定性更大的host。比如,%.test.com 优先于 %.com,%.com 优先于 %,不带通配符的host优先于带通配符的host。

所以,’user1′@’localhost’ 应该优先匹配第四个记录”@’localhost’,可是这个记录密码为空,即:匿名用户无需密码登录,而我们登录时给定了密码,因此还是登录失败。

如果把密码忽略,其实就可以登录了,但db1访问不了,因为没有针对”@’localhost’设置db1的访问权限。

11. 略去密码,就可以登录,但用户身份已经不是user1

$ mysql -uuser1 -h127.0.0.1 -P3307 db1
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'db1'

mysql -uuser1 -h127.0.0.1 -P3307 -e 'SELECT CURRENT_USER();'
+----------------+
| CURRENT_USER() |
+----------------+
| @localhost     |
+----------------+

所以,简单的处理办法还是按照前面介绍的方法,添加user1用户在localhost接入的数据库访问权限。

Posted in MySQL | MongoDB | Leave a comment

也说 MySQL ERROR 1045(28000): Access denied…(上)

也许你类似经历,创建一个数据库,授予一个用户对该数据库的全部权限,然后试图用这个用户登录这个数据,失败…

错误一般表现为:

ERROR 1045 (28000): Access denied for user 'username'@'hostname' (using password: YES)

首先,我们试着重现这个问题。

1. 初始化数据库

$ mkdir /tmp/db
$ cd /tmp
$ mysql_install_db --datadir=/tmp/db

2. 复制并定制配置文件

$ cp /etc/my.cnf /tmp/my.cnf
$ vi /tmp/my.cnf
port = 3307
socket = /tmp/mysql.sock
datadir = /tmp/db
log-error = /tmp/mysqld.log
log = /tmp/mysqld_multi.log

3. 启动新MySQL实例

$ mysqld_safe --defaults-file=/tmp/my.cnf

4. 创建数据库,设置用户权限

$ mysql -uroot -h127.0.0.1 -P3307

mysql> CREATE DATABASE db1;
mysql> GRANT ALL PRIVILEGES ON `db1`.* TO 'user1'@'%' IDENTIFIED BY 'user1';
mysql> FLUSH PRIVILEGES;
mysql> EXIT

5. 重现

$ mysql -uuser1 -puser1 -h127.0.0.1 -P3307 db1
ERROR 1045 (28000): Access denied for user 'user1'@'localhost' (using password: YES)

下面,我们试图分析并解决这个错误。

连接服务器的命令行上,服务器地址使用的是127的回环IP地址,为什么报错是localhost呢?

6. 添加localhost上的user1用户

$ mysql -uroot -h127.0.0.1 -P3307
mysql> CREATE USER 'user1'@'localhost' IDENTIFIED BY 'user1';
mysql> FLUSH PRIVILEGES;
mysql> EXIT

7. 重新登录

$ mysql -uuser1 -puser1 -h127.0.0.1 -P3307 db1
ERROR 1044 (42000): Access denied for user 'user1'@'localhost' to database 'db1'

错误信息变为1044,用户登录成功了,现在是没有数据库访问权限。

8. 设置用户user1@localhost在数据库上的操作权限

$ mysql -uroot -h127.0.0.1 -P3307
mysql> GRANT ALL ON `db1`.* TO 'user1'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> EXIT

9. 重新登录

$ mysql -uuser1 -puser1 -h127.0.0.1 -P3307 db1 -e 'SELECT USER();'
+-----------------+
| USER()          |
+-----------------+
| user1@localhost |
+-----------------+

(未完待续…)

Posted in MySQL | MongoDB | Leave a comment

雇请优秀的人,即便还没有明确定义好的工作

Hire Great People, regardless of if you have a defined role for them.
他对优秀的人的定义是,可以在不同角色上有附加价值、能在你现在和今后遇到问题时提供解决方案。

– Pinterest创始人本·西尔伯曼

Posted in Uncategorized | Leave a comment

It’s Official: J.P. Morgan Invests in Lazada

内容如下,不评论…

We heard rumors about J.P. Morgan wanting to invest up to $50 million in Rocket’s e-commerce Lazada.

It’s official now. The press release doesn’t reveal much detail about the investment, but you can read it in full below:

LAZADA, the leading online department store in Southeast Asia, has confirmed an investment by J.P. Morgan Asset Management, which will take a stake in LAZADA through its German holding.

Following its parallel launch in five Southeast Asian countries during the spring of 2012, LAZADA has become the fastest growing online department store in the region. Since then, LAZADA has surpassed most established local and international competitors and according to web ranking site Alexa.com it is already ranking among the top local B2C eCommerce sites in all of its markets. This growth is a testament to the huge potential of this region with a population of more than 600 million people and a growing young middle-class which are embracing new online experiences – ranging from eCommerce to social media – at an ever increasing pace through their mobile phones or other connected devices.

With the support of Rocket Internet, the leading global online venture incubator (e.g. Zalando, Dafiti), LAZADA has already established itself as a household name in the region by providing a one-stop shopping experience online. With an unrivalled brand and product selection available online, LAZADA has developed a wide offering ranging from consumer electronics to household goods, toys and sports equipment. Today, approximately 1,000 employees are operating streamlined businesses with own logistics and distribution centers in Indonesia, Vietnam, Philippines, Thailand and Malaysia.

“We feel very honoured to welcome J.P. Morgan to our investor group and are particularly excited to be joined by an investor that shares our vision and belief in the huge potential of this populous region replicating online shopping behaviours in developed countries”, regional CEO Maximilian Bittner commented. “This will further support our growth as we strive to offer all of our customers fast, convenient and secure online shopping experiences”.

J.P. Morgan Asset Management Portfolio Manager Robert Cousin, who worked on the deal from New York, confirmed the transaction, saying, “We are excited to partner with LAZADA as it continues to expand its eCommerce presence in Southeast Asia.

original: Techinasia -> J.P. Morgan Invests Lazada

Posted in Uncategorized | 1 Comment

Avoid wordpress config/htaccess lost after ‘git push’ on openshift

OpenShift erases all old source code for git push operation, and data previously created/updated in repo dir will lost definitely.

To avoid data lost after git push for applications such as wordpress, we have to move config/htaccess files to data directory, where user data can survive during deployment.
data dir: /var/lib/stickshift/xxxxxxxx/app-root/data/

1. ssh to your cloud env,

ssh xxxxxxxx@wp-yourid.rhcloud.com

2. cp config & htaccess file to data dir

cd /var/lib/stickshift/xxxxxxxx/app-root/repo/php
cp blog/wp-config.php /var/lib/stickshift/xxxxxxxx/app-root/data/blog/wp-config.php
cp .htaccess /var/lib/stickshift/xxxxxxxx/app-root/data/blog/.htaccess

3. make symble links of config & htaccess from data to repo

cd /var/lib/stickshift/xxxxxxxx/app-root/repo/php/
ln -s /var/lib/stickshift/xxxxxxxx/app-root/data/blog/wp-config.php blog/wp-config.php
ln -s /var/lib/stickshift/xxxxxxxx/app-root/data/blog/.htaccess .htaccess
Posted in OpenShift | OpenStack | Hadoop | Leave a comment